Qt QTreeView 常見節點操作

一杯清酒邀明月發表於2024-06-21

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 );

相關文章