QT的QTreeWidget節點觸發事件(一)
阿新 • • 發佈:2018-12-26
宣告:網路上給出的這方面的資料較少,且都針對的是第一級節點的觸發繫結事件,但是當遇到有不止一級父節點的子節點後,相關內容較少,因此通過實踐整理出了以下方法,進行QTreeWidget節點觸發事件的繫結,方法十分麻煩,也十分初級,希望對初學者能有所幫助。
- 在UI介面中拖入一個QTreeWidget控制元件;
- 利用fucInitGbxTreeBar()方法對其進行初始化(我的QTreeWidget控制元件是放在一個QGroupBox裡面的),程式碼如下:
void frmMain::fucInitGbxTreeBar() { ui->treeWidget->setColumnCount(1); //設定列數 ui->treeWidget->setHeaderLabel(tr("工廠選擇")); //設定頭的標題 QTreeWidgetItem *imageItem1 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("1#工廠"))); imageItem1->setIcon(0,QIcon(GlobalVariable::gloPathFirstLevelMenu)); QTreeWidgetItem *imageItem2 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("2#工廠"))); imageItem2->setIcon(0,QIcon(GlobalVariable::gloPathFirstLevelMenu)); QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("1#車間"))); imageItem1_1->setIcon(0,QIcon(GlobalVariable::gloPathSecondLevelMenu)); imageItem1->addChild(imageItem1_1); //新增子節點 QTreeWidgetItem *imageItem1_2 = new QTreeWidgetItem(imageItem1,QStringList(QString("2#車間"))); imageItem1_2->setIcon(0,QIcon(GlobalVariable::gloPathSecondLevelMenu)); imageItem1->addChild(imageItem1_2); //新增子節點 QTreeWidgetItem *imageItem1_1_1 = new QTreeWidgetItem(imageItem1_1,QStringList(QString("1#產線"))); imageItem1_1_1->setIcon(0,QIcon(GlobalVariable::gloPathThirdLevelMenu)); imageItem1_1->addChild(imageItem1_1_1); //新增子節點 QTreeWidgetItem *imageItem1_1_2 = new QTreeWidgetItem(imageItem1_1,QStringList(QString("2#產線"))); imageItem1_1_2->setIcon(0,QIcon(GlobalVariable::gloPathThirdLevelMenu)); imageItem1_1->addChild(imageItem1_1_2); //新增子節點 QTreeWidgetItem *imageItem1_1_1_1 = new QTreeWidgetItem(imageItem1_1_1,QStringList(QString("1#工位"))); imageItem1_1_1_1->setIcon(0,QIcon(GlobalVariable::gloPathFourthLevelMenu)); imageItem1_1_1->addChild(imageItem1_1_1_1); //新增子節點 QTreeWidgetItem *imageItem1_1_1_2 = new QTreeWidgetItem(imageItem1_1_1,QStringList(QString("2#工位"))); imageItem1_1_1_2->setIcon(0,QIcon(GlobalVariable::gloPathFourthLevelMenu)); imageItem1_1_1->addChild(imageItem1_1_1_2); //新增子節點 connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(fucSlotTest1(QTreeWidgetItem*,int))); //ui->treeWidget->expandAll(); //結點全部展開 }
由上述程式碼可以看出,共有工廠、車間、產線與工位四級,而實現的就是工位級別的雙擊觸發事件的繫結,利用的方法是上段最後一行,即:
connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(fucSlotTest1(QTreeWidgetItem*,int)));
3.在connect事件中,雙擊訊號的第一個引數即為點選的節點,第二個引數為其所在的列(由於本文的QTreeWidget只有一列,因此其固定為1),需要根據第一個引數判定其具體所在:首先判斷其是否有父節點,如果沒有,則是第一級工廠級,根據其text內容,即例項化時設定的“1#工廠”等內容具體判定其所在;如果有,則根據其父節點text內容及本身text內容確定具體層級,對應fucSlotTest1方法,程式碼如下:
void frmMain::fucSlotTest1(QTreeWidgetItem* in1,int in2) { if(in1->parent()) { if(in1->parent()->text(in2)=="1#產線" && in1->text(in2)=="1#工位") { fucCloseGbxAllSubFrm(ui->gbxMainBar); frmTest1 *test1=new frmTest1(ui->gbxMainBar); test1->move(0,0); test1->show(); } else if(in1->parent()->text(in2)=="1#產線" && in1->text(in2)=="2#工位") { fucCloseGbxAllSubFrm(ui->gbxMainBar); frmTest2 *test2=new frmTest2(ui->gbxMainBar); test2->move(0,0); test2->show(); } else { fucCloseGbxAllSubFrm(ui->gbxMainBar); } } }
(fucCloseGbxAllSubFrm方法為清除QGroupBox內的所有子頁面)
總結:通過以上方法可實現對具體子節點的雙擊事件的繫結,同理,單擊事件與其他節點事件的繫結也是如此。但是該方法較為初級,繁瑣,只適用於初學者的練手所用,希望以後可以發現更好的方法