Qt QTreeWidget控件使用方法


最終實現的效果:
在這里插入圖片描述

1.創建QTreeWidget控件

創建QTreeWidget控件,添加父節點,父節點下添加子節點,通過復選框進行選擇。

 1 //初始化控件函數
 2 void MainWindow::init()  3 {  4     QTreeWidget *newTree = new QTreeWidget(this);    //在當前的類里創建一個樹控件
 5     newTree->headerItem()->setText(0,QString());    //設置表頭為空
 6     newTree->setGeometry(50,50,400,240);    //設置起始坐標和大小
 7  QStringList hraders;  8     hraders<<" "<<"類型"<<"時間";  9     newTree->setHeaderLabels(hraders);        //添加樹表的表頭
10     QTreeWidgetItem *item1 = new QTreeWidgetItem(newTree);    //創建第一個父節點
11     item1->setText(0,"111"); 12     item1->setCheckState(0,Qt::Unchecked);        //添加復選框,起始為未勾選
13     item1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); 14     //Qt::ItemIsSelectable表示可選的 15     //Qt::ItemIsUserCheckable項目上是否有復選框 16     //Qt::ItemIsEnabled 項目上是否沒有被禁用(Enabled可用/Disabled禁用)
17     QTreeWidgetItem *item1_1 = new QTreeWidgetItem(item1);        //添加子節點
18     item1_1->setText(0,"111_111"); 19     item1_1->setCheckState(0,Qt::Unchecked); 20     item1_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); 21 
22     QTreeWidgetItem *item1_2 = new QTreeWidgetItem(item1); 23     item1_2->setText(0,"111_222"); 24     item1_2->setCheckState(0,Qt::Unchecked); 25     item1_2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); 26 
27     QTreeWidgetItem *item1_3 = new QTreeWidgetItem(item1); 28     item1_3->setText(0,"111_333"); 29     item1_3->setCheckState(0,Qt::Unchecked); 30     item1_3->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); 31 
32     QTreeWidgetItem *item2 = new QTreeWidgetItem(newTree); 33     item2->setText(0,"222"); 34     item2->setCheckState(0,Qt::Unchecked); 35     item2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); 36 
37     QTreeWidgetItem *item2_1 = new QTreeWidgetItem(item2); 38     item2_1->setText(0,"222_222"); 39     item2_1->setCheckState(0,Qt::Unchecked); 40     item2_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); 41     connect(newTree,SIGNAL(itemClicked(QTreeWidgetItem *, int)),this,SLOT(treeCheck(QTreeWidgetItem *, int))); 42     //注意:信號一定只聲明變量類型,不要加變量名,是否會報錯,找不到該信號
43 }

2.類中定義的函數

槽函數:

1 public slots: 2     void treeCheck(QTreeWidgetItem *item, int column);

與itemClicked信號想連接,當有觸發信號時,會傳遞參數,判斷操作的是哪個節點。

1 pubilc: 2     void PartiallyCheck(QTreeWidgetItem *item);

3.槽函數的實現

 1 void MainWindow::treeCheck(QTreeWidgetItem *item, int column)  2 {  3     if(Qt::Checked == item->checkState(0))        //若被選中
 4  {  5         int count = item->childCount();            //得到選中的子節點個數
 6         if(count>0)                                //若大於0,說明選中的是父節點,則將全部的子節點選中
 7  {  8             for (int i = 0;i<count;i++) {  9                 item->child(i)->setCheckState(0,Qt::Checked); 10  } 11  } 12         else {                                //否則選中的是子節點
13             PartiallyCheck(item);            //將節點傳到函數中進行其他操作
14  } 15  } 16     else if(Qt::Unchecked == item->checkState(0)){    //沒有被選中
17         int count = item->childCount(); 18         if(count>0) 19  { 20             for (int i = 0;i<count;i++) { 21                 item->child(i)->setCheckState(0,Qt::Unchecked); 22  } 23  } 24         else { 25  PartiallyCheck(item); 26  } 27  } 28 } 29 
30 void MainWindow::PartiallyCheck(QTreeWidgetItem *item) 31 { 32     //得到節點的父節點,首先判斷是否為空,為空說明是父節點,則直接退出,若不加判斷會造成程序異常退出。
33     QTreeWidgetItem *parent = item->parent(); 34     if(parent==nullptr) 35         return; 36     int selectedCount = 0;        //記錄被選中的子節點個數
37     int count = parent->childCount();        //記錄子節點個數
38     for (int i = 0;i<count ;i++) {            //父節點下的所有子節點,記錄選中的子節點個數
39         if(parent->child(i)->checkState(0)==Qt::Checked) 40             selectedCount++; 41  } 42     if(selectedCount<=0)                    //等於0說明沒有子節點被選中,則將父節點取消選中
43         parent->setCheckState(0,Qt::Unchecked); 44     else if(selectedCount>0&&selectedCount<count)    //若大於0且小於總的子節點數,說明選中了一部分,則將父節點設置為半選中
45         parent->setCheckState(0,Qt::PartiallyChecked); 46     else {                                //否則,全選中
47         parent->setCheckState(0,Qt::Checked); 48  } 49 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM