Qt進階--Item Views詳解(基礎,原創,超級詳細)

 

在設計窗口的控件欄有一種控件叫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的配合使用:

遙遙無期,有緣再更......

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章