最終實現的效果:
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 }