在設計窗口的控件欄有一種控件叫Item Views,非常有用但是很多人不會,這裏詳細講一下.
用處:
按照一定格式現實數據(列表,表格,樹),並且可以在對數據操作的時候增加槽函數.
----Excel,
----還有這種文件樹狀圖;
基本原理:
就是MVC(Model View Controller,模型-視圖-控制器/代理):
這個在遊戲和網絡應用開發都涉及到:
http://c.biancheng.net/view/1864.html
https://zhuanlan.zhihu.com/p/42719287
都講得不錯,其實就是一種解耦的思想.
現在我們知道模型和視圖關聯,不同的模型要關聯不同的視圖.
先放一張模型類和視圖類的大圖:
下面本文主要分三個部分,依次講解圖中三種model/view的配合使用:
1.QStringListModel和QListView的配合使用:
它們的詳細用法分爲以下幾個部分:
1.1.初始化(在父窗口的構造函數中演示):
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//QStringListModel可以理解爲一個儲存着數據的盒子,要先準備好盒子裏的初始數據
QStringList theStrList; //保存初始 StringList
theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"山東"<<"四川"<<"重慶"<<"廣東"<<"河南"; //初始化 StringList
//創建模型對象,注意它的構造函數的參數是父窗口,而不是列表視圖控件
theModel=new QStringListModel(this);
//setStringList() 函數可以初始化數據模型的字符串列表的內容
//也就是把數據裝進這個盒子裏
theModel->setStringList(theStrList);
//在這裏使用setModel()關聯模型和視圖
//爲listView設置數據模型
ui->listView->setModel(theModel);
}
1.2.編輯設置:
設置 QListView 的條目是否可以編輯,以及如何進入編輯狀態
QListView::setEditTriggers():設置 QListView 的條目是否可以編輯,以及如何進入編輯狀態
參數如下(從幫助手冊截下來的):
1.3.添加和修改操作:
在列表中添加一行,或者修改某一行的數據
首先要在知道:
模型索引(model index)
模型不提供接口直接給你數據,而是要先獲取模型索引對象,
再用模型索引從模型中獲取數據.(這個東西看起來多此一舉,麻煩了,但在樹狀視圖中就簡單了)
具體講解還是看:http://c.biancheng.net/view/1864.html
講的非常基礎了
同時還要知道的幾個接口:
bool QStringListModel::insertRow (int row):row 是一個行號,表示在 row 行之前插入一個空行,這個行沒有內容;
QModelIndex QStringListModel::index(int row, int column = 0, const QModelIndex &parent = QModelIndex()):根據傳遞的行號、列號、父項的模型索引生成一個模型索引,這個模型索引就是你在模型中獲取,修改數據的憑證;int
int QModelIndex::row():返回本模型索引對象的列數;
QModelIndex QListView::currentIndex():返回視圖中選中的項的模型索引,很方便;
int QStringListModel::rowCount ():當前模型的總行數;
(這裏再說一點,模型中的每個項會有很多role--角色,在不同的條件下顯示不同的role,就好像一個人有很多身份,如父親,職員,丈夫,在不同的場合有不同的身份)
bool QStringListModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole):將index處的項的指定role的數據設爲value;
一個項的角色(role)的可選參數如下(也是從幫助手冊當的):
結論:
在添加項(行)的步驟:
用insertRow()添加一行準備放數據---->使用index()獲取目標項的模型索引---->通過setData()設置項的數據;
修改項(行的步驟):
使用index()獲取目標項的模型索引---->通過setData()設置項的數據;
實例代碼:
//在列表的最後添加一行
//添加一個空行做準備
theModel->insertRow(theModel->rowCount());
//獲取最後一行的模型索引
QModelIndex index=theModel->index(theModel->rowCount()-1);
//根據模型索引修改最後一項的顯示角色的數據
theModel->setData(index,"添加的新數據",Qt::DisplayRole);
1.4.刪除操作:
刪除一行和刪除多行,兩個QStringListModel提供的接口;
removeRow(int row):刪除指定行;
removeRows(int row,int count):從row行開始,刪除count列;
1.5:查詢操作:
也就是在代碼中獲取指定位置的項的值
主要就是這個方法:
QStringList QStringListModel::stringList() const:就是把模型中的數據取出來
然後你再對獲取到的QStringList指定位置查詢就好.
2.QStandardItemModel和QTableView的配合使用:
儘量明天更新
3.QStandardItemModel和QTreeView的配合使用:
遙遙無期,有緣再更......