QTreeView作為專案最經常使用的空間,常用介面和操作必須熟悉熟悉在熟悉!!!
1、節點遍歷
1 void ParamSettingDlg::GetNode()
2 {
3 for(int i = 0;i < model->rowCount() ;i++)
4 {
5 QStandardItem *item = model->item(i);
6
7 qDebug() <<"item = " << item->text();
8 GetItem(model->item(i) );
9 }
10 }
11
12 //GetItem 為遞迴函式,這樣可以遍歷到所有的節點
13
14 void ParamSettingDlg::GetItem(QStandardItem *item)
15 {
16 Q_ASSERT(item);
17 if(item->hasChildren())
18 {
19 for(int i = 0;i < item->rowCount() ;i++)
20 {
21 QStandardItem * childitem = item->child(i);
22 qDebug() << "childitem = " << childitem->text();
23 GetItem(childitem);
24 }
25 }
26 }
2、設定當前選中項
介面setCurrentIndex
1 for(int i = 0;i < standardModel_down->rowCount() ;i++)
2 {
3 QStandardItem *item = standardModel_down->item(i);
4 Q_ASSERT(item);
5 if(item->hasChildren())
6 {
7 for(int i = 0;i < item->rowCount() ;i++)
8 {
9 QStandardItem * childitem = item->child(i);
10 qDebug() << "childitem = " << childitem->text();
11 if(childitem->text() == fileName1)
12 {
13 ui->treeView_down->setCurrentIndex(childitem->index());
14 }
15 }
16 }
17 qDebug() <<"item = " << item->text();
18 }
3、樹節點自定義樣式
使用介面setIndexWidget,其實QTableWidget的setCellWidget藉口內部也是呼叫 setIndexWidget。如下:
1 QStandardItem *children = new QStandardItem();
2 QStandardItem *parent = model->item(r,c);
3 parent->appendRow(children);
4
5 QModelIndex index = model->indexFromItem(children);
6 ui->treeView->setIndexWidget(index,myLabel);
示例
1 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
2 {
3 ui->setupUi(this);
4
5 QStandardItemModel* model = new QStandardItemModel();
6 ui->tableView->setModel(model);
7 ui->tableView->setFocusPolicy(Qt::NoFocus); //去掉選中單元格時的虛框
8
9 model->setHorizontalHeaderLabels({"姓名", "年齡", "性別"});
10 model->setItem(0, 0, new QStandardItem("張三"));
11 model->setItem(0, 1, new QStandardItem("3"));
12
13 QComboBox* cmb = new QComboBox();
14 cmb->addItems({"男", "女"});
15 ui->tableView->setIndexWidget(model->index(0, 2), cmb);
16
17 model->setItem(1, 0, new QStandardItem("李四"));
18 model->setItem(1, 1, new QStandardItem("5"));
19
20 cmb = new QComboBox();
21 cmb->addItems({"男", "女"});
22 ui->tableView->setIndexWidget(model->index(1, 2), cmb);
23 }
4、資料檢索
藉助代理類QSortFilterProxyModel
1 m_model = new QStandardItemModel(ui->treeView);//模型
2 m_pFilterModel = new QSortFilterProxyModel(ui->treeView);//過濾模型
3
4 m_pFilterModel->setSourceModel(m_model);
5 m_pFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); //大小寫不敏感
6 m_pFilterModel->setAutoAcceptChildRows(true); //父項滿足時不過濾子項
7 m_pFilterModel->setRecursiveFilteringEnabled(true); //遞迴匹配滿足的子節點,父類可見
8 //指定初始化過濾列
9 m_pFilterModel->setFilterKeyColumn(0);
10 ui->treeView->setModel(m_pFilterModel);
5、獲取當前選中項
透過QTreeView函式 currentIndex ()可以獲取當前選中條目的QModelIndex,QModelIndex可以看做是QStandardItem的資料封裝,知道 QModelIndex就可以知道QStandardItem,透過QStandardItemModel的 itemFromIndex 函式即可得到QModelIndex對應的QStandardItem。
如:
1 QStandardItemModel* model = static_cast< QStandardItemModel*>( ui-> treeView-> model());
2 QModelIndex currentIndex = ui-> treeView-> currentIndex();
3 QStandardItem* currentItem = model-> itemFromIndex( currentIndex );