天天看點

QT QTreeWidget控件使用方法1.建立QTreeWidget控件2.類中定義的函數3.槽函數的實作

QT QTreeWidget控件使用

  • 1.建立QTreeWidget控件
  • 2.類中定義的函數
  • 3.槽函數的實作

最終實作的效果:

QT QTreeWidget控件使用方法1.建立QTreeWidget控件2.類中定義的函數3.槽函數的實作

1.建立QTreeWidget控件

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

//初始化控件函數
void MainWindow::init()
{
    QTreeWidget *newTree = new QTreeWidget(this);	//在目前的類裡建立一個樹控件
    newTree->headerItem()->setText(0,QString());	//設定表頭為空
    newTree->setGeometry(50,50,400,240);	//設定起始坐标和大小
    QStringList hraders;
    hraders<<" "<<"類型"<<"時間";
    newTree->setHeaderLabels(hraders);		//添加樹表的表頭
    QTreeWidgetItem *item1 = new QTreeWidgetItem(newTree);	//建立第一個父節點
    item1->setText(0,"111");							
    item1->setCheckState(0,Qt::Unchecked);		//添加複選框,起始為未勾選
    item1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
	//Qt::ItemIsSelectable表示可選的
	//Qt::ItemIsUserCheckable項目上是否有複選框
	//Qt::ItemIsEnabled 項目上是否沒有被禁用(Enabled可用/Disabled禁用)
    QTreeWidgetItem *item1_1 = new QTreeWidgetItem(item1);		//添加子節點
    item1_1->setText(0,"111_111");
    item1_1->setCheckState(0,Qt::Unchecked);
    item1_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item1_2 = new QTreeWidgetItem(item1);
    item1_2->setText(0,"111_222");
    item1_2->setCheckState(0,Qt::Unchecked);
    item1_2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item1_3 = new QTreeWidgetItem(item1);
    item1_3->setText(0,"111_333");
    item1_3->setCheckState(0,Qt::Unchecked);
    item1_3->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item2 = new QTreeWidgetItem(newTree);
    item2->setText(0,"222");
    item2->setCheckState(0,Qt::Unchecked);
    item2->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

    QTreeWidgetItem *item2_1 = new QTreeWidgetItem(item2);
    item2_1->setText(0,"222_222");
    item2_1->setCheckState(0,Qt::Unchecked);
    item2_1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
    connect(newTree,SIGNAL(itemClicked(QTreeWidgetItem *, int)),this,SLOT(treeCheck(QTreeWidgetItem *, int)));
    //注意:信号一定隻聲明變量類型,不要加變量名,是否會報錯,找不到該信号
}

           

2.類中定義的函數

1.槽函數:

public slots:

void treeCheck(QTreeWidgetItem *item, int column);

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

2.pubile:

void PartiallyCheck(QTreeWidgetItem *item);

3.槽函數的實作

void MainWindow::treeCheck(QTreeWidgetItem *item, int column)
{
    if(Qt::Checked == item->checkState(0))		//若被選中
    {
        int count = item->childCount();			//得到選中的子節點個數
        if(count>0)								//若大于0,說明選中的是父節點,則将全部的子節點選中
        {
            for (int i = 0;i<count;i++) {		
                item->child(i)->setCheckState(0,Qt::Checked);
            }
        }
        else {								//否則選中的是子節點
            PartiallyCheck(item);			//将節點傳到函數中進行其他操作
        }
    }
    else if(Qt::Unchecked == item->checkState(0)){	//沒有被選中
        int count = item->childCount();
        if(count>0)
        {
            for (int i = 0;i<count;i++) {
                item->child(i)->setCheckState(0,Qt::Unchecked);
            }
        }
        else {
            PartiallyCheck(item);
        }
    }
}

void MainWindow::PartiallyCheck(QTreeWidgetItem *item)
{
	//得到節點的父節點,首先判斷是否為空,為空說明是父節點,則直接退出,若不加判斷會造成程式異常退出。
    QTreeWidgetItem *parent = item->parent();
    if(parent==nullptr)
        return;
    int selectedCount = 0;		//記錄被選中的子節點個數
    int count = parent->childCount();		//記錄子節點個數
    for (int i = 0;i<count ;i++) {			//父節點下的所有子節點,記錄選中的子節點個數
        if(parent->child(i)->checkState(0)==Qt::Checked)
            selectedCount++;
    }
    if(selectedCount<=0)					//等于0說明沒有子節點被選中,則将父節點取消選中
        parent->setCheckState(0,Qt::Unchecked);
    else if(selectedCount>0&&selectedCount<count)	//若大于0且小于總的子節點數,說明選中了一部分,則将父節點設定為半選中
        parent->setCheckState(0,Qt::PartiallyChecked);
    else {								//否則,全選中
        parent->setCheckState(0,Qt::Checked);
    }
}
           

繼續閱讀