天天看點

QT的QTreeWidget節點觸發事件(一)

聲明:網絡上給出的這方面的資料較少,且都針對的是第一級節點的觸發綁定事件,但是當遇到有不止一級父節點的子節點後,相關内容較少,是以通過實踐整理出了以下方法,進行QTreeWidget節點觸發事件的綁定,方法十分麻煩,也十分初級,希望對初學者能有所幫助。

  1. 在UI界面中拖入一個QTreeWidget控件;
  2. 利用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内的所有子頁面)

總結:通過以上方法可實作對具體子節點的輕按兩下事件的綁定,同理,單擊事件與其他節點事件的綁定也是如此。但是該方法較為初級,繁瑣,隻适用于初學者的練手所用,希望以後可以發現更好的方法

繼續閱讀