国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ Qt開發(fā):TreeWidget 樹形選擇組件

這篇具有很好參考價(jià)值的文章主要介紹了C++ Qt開發(fā):TreeWidget 樹形選擇組件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹TreeWidget樹形選擇組件的常用方法及靈活運(yùn)用。

QTreeWidget 是 Qt 中的樹形控件組件,用于顯示樹形結(jié)構(gòu)的數(shù)據(jù)。它繼承自 QTreeViewQTreeWidget,提供了一個(gè)方便的方式來展示和編輯包含層次結(jié)構(gòu)數(shù)據(jù)的項(xiàng)目。

以下是 QTreeWidget 類的一些常用方法,說明和概述:

方法 描述
addTopLevelItem(QTreeWidgetItem *item) 向樹中添加一個(gè)頂級(jí)項(xiàng)目。
addTopLevelItems(const QList<QTreeWidgetItem *> &items) 向樹中添加多個(gè)頂級(jí)項(xiàng)目。
clear() 清除樹中的所有項(xiàng)目。
currentItem() 返回當(dāng)前選擇的項(xiàng)目。
currentIndex() 返回當(dāng)前選擇的項(xiàng)目的模型索引。
editItem(QTreeWidgetItem *item, int column) 進(jìn)入編輯模式以編輯給定項(xiàng)目的指定列。
headerItem() 返回樹的標(biāo)題項(xiàng)目,該項(xiàng)目可用于設(shè)置標(biāo)題標(biāo)簽。
invisibleRootItem() 返回樹的不可見根項(xiàng)目。
itemAbove(QTreeWidgetItem *item) 返回給定項(xiàng)目的上面一個(gè)項(xiàng)目。
itemBelow(QTreeWidgetItem *item) 返回給定項(xiàng)目的下面一個(gè)項(xiàng)目。
setCurrentItem(QTreeWidgetItem *item) 設(shè)置當(dāng)前選擇的項(xiàng)目。
topLevelItem(int index) 返回樹中給定索引的頂級(jí)項(xiàng)目。
topLevelItemCount() 返回樹的頂級(jí)項(xiàng)目的數(shù)量。
insertTopLevelItem(int index, QTreeWidgetItem *item) 在給定索引處插入一個(gè)頂級(jí)項(xiàng)目。
insertTopLevelItems(int index, const QList<QTreeWidgetItem *> &items) 在給定索引處插入多個(gè)頂級(jí)項(xiàng)目。
takeTopLevelItem(int index) 從樹中移除給定索引處的頂級(jí)項(xiàng)目,并返回該項(xiàng)目的指針。
scrollToItem(QTreeWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) 滾動(dòng)樹以確保給定項(xiàng)目可見。
sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder) 對(duì)樹中的項(xiàng)目進(jìn)行排序。
findItems(const QString &text, Qt::MatchFlags flags, int column = 0) 查找樹中包含指定文本的項(xiàng)目。

這只是 QTreeWidget 類的一小部分方法。你可以查閱官方文檔以獲取完整的方法列表,以及這些方法的詳細(xì)說明。

首先我們來繪制一下UI界面,由于該節(jié)點(diǎn)同時(shí)具備編輯功能所以實(shí)現(xiàn)起來要稍微復(fù)雜一些,我們分別在最左側(cè)放置一個(gè)TreeWidget組件,在中間放置不同的PushButton組件,最后是一個(gè)plainTextEdit組件用來接收反饋,如下圖所示;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.1 初始化組件

如下代碼是在 Qt 中使用 QTreeWidget 初始化一個(gè)樹形結(jié)構(gòu),其中包含了朋友、同學(xué)和陌生人等不同分類的節(jié)點(diǎn)。

以下是概述:

  1. 初始化 QTreeWidget 設(shè)置 QTreeWidget 的一些基本屬性,包括列數(shù)、標(biāo)題的隱藏等。
  2. 創(chuàng)建父節(jié)點(diǎn) "朋友": 使用 QTreeWidgetItem 創(chuàng)建一個(gè)朋友節(jié)點(diǎn),并設(shè)置圖標(biāo)、選擇狀態(tài)等屬性。然后添加兩個(gè)子節(jié)點(diǎn) "老張" 和 "老王",分別設(shè)置圖標(biāo)和選擇狀態(tài)。
  3. 創(chuàng)建父節(jié)點(diǎn) "同學(xué)": 類似地,創(chuàng)建一個(gè)同學(xué)節(jié)點(diǎn),并添加兩個(gè)子節(jié)點(diǎn) "張三" 和 "李四",設(shè)置相應(yīng)的圖標(biāo)和選擇狀態(tài)。
  4. 創(chuàng)建 "陌生人" 節(jié)點(diǎn): 使用 QTreeWidgetItem 直接創(chuàng)建一個(gè)陌生人節(jié)點(diǎn),并設(shè)置文本和圖標(biāo)。
  5. 將節(jié)點(diǎn)添加到 QTreeWidget 中: 使用 addTopLevelItem 將 "同學(xué)" 和 "陌生人" 節(jié)點(diǎn)添加到 QTreeWidget 的頂級(jí)。
  6. 展開所有節(jié)點(diǎn): 使用 expandAll 展開所有節(jié)點(diǎn),使其在初始化時(shí)可見。
  7. 設(shè)置 QTreeWidget 的大小: 使用 resize 設(shè)置 QTreeWidget 的大小。

這段代碼的主要功能是創(chuàng)建一個(gè)包含不同分類和子節(jié)點(diǎn)的樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)可以有不同的圖標(biāo)、文本和選擇狀態(tài)。在展示的樹形結(jié)構(gòu)中,朋友和同學(xué)節(jié)點(diǎn)有子節(jié)點(diǎn),而陌生人節(jié)點(diǎn)沒有子節(jié)點(diǎn)。這個(gè)示例展示了 QTreeWidget 用于創(chuàng)建層次結(jié)構(gòu)的基本用法。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->treeWidget->clear();

    // ----------------------------------------------
    // 初始化TreeWidget組件
    // ----------------------------------------------

    // 設(shè)置QTreeWidget的列數(shù)
    ui->treeWidget->setColumnCount(1);

    // 設(shè)置QTreeWidget標(biāo)題隱藏
    ui->treeWidget->setHeaderHidden(true);

    // ----------------------------------------------
    // 創(chuàng)建QTreeWidget的朋友節(jié)點(diǎn) 此時(shí)的父節(jié)點(diǎn)是TreeWidget
    // ----------------------------------------------

    QTreeWidgetItem *Friend = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("朋友")));
    Friend->setIcon(0,QIcon(":/image/4.ico"));
    Friend->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable
                     | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
    Friend->setCheckState(0,Qt::Checked);

    // 給Friend添加一個(gè)子節(jié)點(diǎn)frd
    QTreeWidgetItem *frd = new QTreeWidgetItem(Friend);
    frd->setText(0,"老張");
    frd->setIcon(0,QIcon(tr(":/image/1.ico")));
    frd->setCheckState(0,Qt::Checked);

    // 繼續(xù)給Friend添加一個(gè)子節(jié)點(diǎn)frs
    QTreeWidgetItem *frs = new QTreeWidgetItem(Friend);
    frs->setText(0,"老王");
    frs->setIcon(0,QIcon(tr(":/image/1.ico")));
    frs->setCheckState(0,Qt::Unchecked);

    // ----------------------------------------------
    // 繼續(xù)創(chuàng)建名叫同學(xué)節(jié)點(diǎn) 父節(jié)點(diǎn)同樣是TreeWidget
    // ----------------------------------------------
    QTreeWidgetItem * ClassMate = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("同學(xué)")));
    ClassMate->setIcon(0,QIcon(":/image/5.ico"));
    ClassMate->setCheckState(0,Qt::Checked);

    // Fly是ClassMate的子節(jié)點(diǎn)
    QTreeWidgetItem *Fly = new QTreeWidgetItem(QStringList(QString("張三")));
    Fly->setIcon(0,QIcon(tr(":/image/2.ico")));

    // 創(chuàng)建子節(jié)點(diǎn)的另一種方法
    ClassMate->addChild(Fly);
    Fly->setCheckState(0,Qt::Checked);

    // 繼續(xù)創(chuàng)建子節(jié)點(diǎn)Fls
    QTreeWidgetItem *Fls = new QTreeWidgetItem(QStringList(QString("李四")));
    Fls->setIcon(0,QIcon(tr(":/image/2.ico")));
    ClassMate->addChild(Fls);
    Fls->setCheckState(0,Qt::Checked);       // 設(shè)置為選中

    // ----------------------------------------------
    // 創(chuàng)建陌生人節(jié)點(diǎn)
    // ----------------------------------------------
    QTreeWidgetItem  *Strange = new QTreeWidgetItem(true);
    Strange->setText(0,"陌生人");
    Strange->setIcon(0,QIcon(":/image/6.ico"));

    ui->treeWidget->addTopLevelItem(ClassMate);
    ui->treeWidget->addTopLevelItem(Strange);

    // 展開QTreeWidget的所有節(jié)點(diǎn)
    ui->treeWidget->expandAll();
    ui->treeWidget->resize(271,401);
}

代碼運(yùn)行后可動(dòng)態(tài)對(duì)左側(cè)組件進(jìn)行初始化,并增加應(yīng)有的父節(jié)點(diǎn)與子節(jié)點(diǎn),如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.2 添加根節(jié)點(diǎn)

如下槽函數(shù),其核心功能是在 QTreeWidget 中添加一個(gè)新的頂級(jí)父節(jié)點(diǎn),并在 QPlainTextEdit 中添加一行文本記錄。

以下是概述:

  1. 獲取節(jié)點(diǎn)文本: 使用 QString NodeText = "新的父節(jié)點(diǎn)"; 設(shè)置新父節(jié)點(diǎn)的文本。
  2. 創(chuàng)建新的 QTreeWidgetItem 使用 QTreeWidgetItem 的構(gòu)造函數(shù)創(chuàng)建一個(gè)新的頂級(jí)父節(jié)點(diǎn),并設(shè)置其文本和圖標(biāo)。
  3. 添加節(jié)點(diǎn)到 QTreeWidget 中: 使用 ui->treeWidget->addTopLevelItem(item); 將新的頂級(jí)父節(jié)點(diǎn)添加到 QTreeWidget 中。
  4. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("添加新的父節(jié)點(diǎn)"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),在 QTreeWidget 中添加一個(gè)新的頂級(jí)父節(jié)點(diǎn),并在 QPlainTextEdit 中記錄這一操作。這樣可以用于在界面上動(dòng)態(tài)添加樹節(jié)點(diǎn),并記錄相關(guān)的操作信息。

void MainWindow::on_pushButton_add_clicked()
{
    QString NodeText = "新的父節(jié)點(diǎn)";
    QTreeWidgetItem  *item = new QTreeWidgetItem(true);
    item->setText(0,NodeText);
    item->setIcon(0,QIcon(":/image/7.ico"));
    ui->treeWidget->addTopLevelItem(item);
    ui->plainTextEdit->appendPlainText("添加新的父節(jié)點(diǎn)");
}

運(yùn)行后通過點(diǎn)擊添加根節(jié)點(diǎn)按鈕,每次則可以生成一個(gè)根,如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.3 添加子節(jié)點(diǎn)

如下槽函數(shù),其核心功能是在 QTreeWidget 中添加新的子節(jié)點(diǎn),并在 QPlainTextEdit 中添加一行文本記錄。

以下是概述:

  1. 獲取當(dāng)前選擇的節(jié)點(diǎn): 使用 QTreeWidgetItem * item= ui->treeWidget->currentItem(); 獲取當(dāng)前在 QTreeWidget 中選擇的節(jié)點(diǎn)。
  2. 判斷是否有選擇的節(jié)點(diǎn): 使用 if(item!=NULL) 條件判斷,如果存在選擇的節(jié)點(diǎn),則調(diào)用 AddTreeNode 函數(shù)添加子節(jié)點(diǎn);否則,調(diào)用 AddTreeRoot 函數(shù)添加新的根節(jié)點(diǎn)。
  3. 添加子節(jié)點(diǎn)或新的根節(jié)點(diǎn):
    • 如果存在選擇的節(jié)點(diǎn),調(diào)用 AddTreeNode(item,"新子節(jié)點(diǎn)","新子節(jié)點(diǎn)"); 添加一個(gè)新的子節(jié)點(diǎn),其文本和圖標(biāo)分別為 "新子節(jié)點(diǎn)"。
    • 如果沒有選擇的節(jié)點(diǎn),調(diào)用 AddTreeRoot("新子節(jié)點(diǎn)","新子節(jié)點(diǎn)"); 添加一個(gè)新的根節(jié)點(diǎn),其文本和圖標(biāo)同樣為 "新子節(jié)點(diǎn)"。
  4. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("添加新的子節(jié)點(diǎn)"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),根據(jù)用戶當(dāng)前選擇的節(jié)點(diǎn)狀態(tài),在 QTreeWidget 中添加新的子節(jié)點(diǎn)或新的根節(jié)點(diǎn),并記錄這一操作到 QPlainTextEdit 中。

QTreeWidgetItem * MainWindow::AddTreeRoot(QString name,QString desc)
{
    QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
    ui->treeWidget->addTopLevelItem(item);
    return item;
}

QTreeWidgetItem * MainWindow::AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc)
{
    QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
    parent->addChild(item);
    return item;
}

void MainWindow::on_pushButton_addsubnode_clicked()
{
    QTreeWidgetItem * item= ui->treeWidget->currentItem();
        if(item!=NULL)
            AddTreeNode(item,"新子節(jié)點(diǎn)","新子節(jié)點(diǎn)");
        else
            AddTreeRoot("新子節(jié)點(diǎn)","新子節(jié)點(diǎn)");

        ui->plainTextEdit->appendPlainText("添加新的子節(jié)點(diǎn)");
}

子節(jié)點(diǎn)的添加依賴于封裝好的兩個(gè)AddTreeNode函數(shù),通過調(diào)用后則可以在父節(jié)點(diǎn)上添加子節(jié)點(diǎn),如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.4 修改選中節(jié)點(diǎn)

如下槽函數(shù),其核心功能是修改 QTreeWidget 中當(dāng)前選中節(jié)點(diǎn)的文本和圖標(biāo),并在 QPlainTextEdit 中添加一行文本記錄。

以下是概述:

  1. 獲取當(dāng)前選中的節(jié)點(diǎn): 使用 QTreeWidgetItem *currentItem = ui->treeWidget->currentItem(); 獲取當(dāng)前在 QTreeWidget 中選擇的節(jié)點(diǎn)。
  2. 判斷是否存在選擇的節(jié)點(diǎn): 使用 if(currentItem == NULL) 條件判斷,如果沒有選擇的節(jié)點(diǎn),則直接返回。
  3. 修改選中節(jié)點(diǎn)的文本和圖標(biāo): 使用 for 循環(huán)遍歷節(jié)點(diǎn)的所有列,通過 setText 修改每一列的文本為 "Modify" 加上列索引的字符串,通過 setIcon 修改每一列的圖標(biāo)為特定的圖標(biāo)。
  4. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("修改節(jié)點(diǎn)名"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),修改 QTreeWidget 中當(dāng)前選中節(jié)點(diǎn)的文本和圖標(biāo),同時(shí)在 QPlainTextEdit 中記錄這一修改操作。

void MainWindow::on_pushButton_modifynode_clicked()
{
    // 得到當(dāng)前節(jié)點(diǎn)
    QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
    if(currentItem == NULL)
        return;
    // 修改選中項(xiàng)
    for(int x=0;x<currentItem->columnCount();x++)
    {
        currentItem->setText(x,tr("Modify") + QString::number(x));
        currentItem->setIcon(x,QIcon(":/image/1.ico"));
    }

    ui->plainTextEdit->appendPlainText("修改節(jié)點(diǎn)名");
}

修改節(jié)點(diǎn)的執(zhí)行效果如下圖,當(dāng)點(diǎn)擊修改選中節(jié)點(diǎn)后則將自動(dòng)替換節(jié)點(diǎn)名和圖標(biāo)信息。

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.5 刪除選中節(jié)點(diǎn)

如下槽函數(shù),其核心功能是刪除 QTreeWidget 中當(dāng)前選中節(jié)點(diǎn),并在 QPlainTextEdit 中添加一行文本記錄。

以下是概述:

  1. 獲取當(dāng)前選中的節(jié)點(diǎn): 使用 QTreeWidgetItem *currentItem = ui->treeWidget->currentItem(); 獲取當(dāng)前在 QTreeWidget 中選擇的節(jié)點(diǎn)。
  2. 判斷是否存在選擇的節(jié)點(diǎn): 使用 if(currentItem == NULL) 條件判斷,如果沒有選擇的節(jié)點(diǎn),則直接返回。
  3. 判斷是否為頂級(jí)父節(jié)點(diǎn): 使用 if(currentItem->parent() == NULL) 條件判斷,如果當(dāng)前節(jié)點(diǎn)沒有父節(jié)點(diǎn)(即為頂級(jí)父節(jié)點(diǎn)),則使用 ui->treeWidget->takeTopLevelItem 刪除該節(jié)點(diǎn)。
  4. 如果有父節(jié)點(diǎn),使用父節(jié)點(diǎn)的 takeChild 刪除子節(jié)點(diǎn): 使用 delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row()); 刪除當(dāng)前節(jié)點(diǎn)。這種情況下,要使用父節(jié)點(diǎn)的 takeChild 方法,因?yàn)橹苯觿h除會(huì)導(dǎo)致父節(jié)點(diǎn)無法正確管理子節(jié)點(diǎn)。
  5. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("刪除一個(gè)節(jié)點(diǎn)"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),刪除 QTreeWidget 中當(dāng)前選中的節(jié)點(diǎn),并記錄這一刪除操作到 QPlainTextEdit 中。

void MainWindow::on_pushButton_delnode_clicked()
{
    QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
    if(currentItem == NULL)
        return;

    // 如果沒有父節(jié)點(diǎn)則直接刪除
    if(currentItem->parent() == NULL)
    {
        delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
        std::cout << ui->treeWidget->currentIndex().row() << std::endl;
    }
    else
    {
        // 如果有父節(jié)點(diǎn)就要用父節(jié)點(diǎn)的takeChild刪除節(jié)點(diǎn)
        delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
    }

    ui->plainTextEdit->appendPlainText("刪除一個(gè)節(jié)點(diǎn)");
}

刪除節(jié)點(diǎn)有兩種情況,如果只有父節(jié)點(diǎn)那么可以直接刪除,如果有子節(jié)點(diǎn)則那就要一并刪除,如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.6 枚舉全部節(jié)點(diǎn)

如下槽函數(shù),其核心功能是遍歷 QTreeWidget 中的所有節(jié)點(diǎn),并輸出每個(gè)節(jié)點(diǎn)的文本。

以下是概述:

  1. 獲取全部的根節(jié)點(diǎn)數(shù)量: 使用 int size = ui->treeWidget->topLevelItemCount(); 獲取頂級(jí)父節(jié)點(diǎn)的數(shù)量。
  2. 遍歷所有根節(jié)點(diǎn): 使用 for 循環(huán)遍歷每一個(gè)根節(jié)點(diǎn),通過 ui->treeWidget->topLevelItem(x) 獲取當(dāng)前的根節(jié)點(diǎn)。
  3. 輸出所有根節(jié)點(diǎn): 使用 child->text(0).toStdString().data() 輸出當(dāng)前根節(jié)點(diǎn)的文本信息,并將其輸出到標(biāo)準(zhǔn)輸出流。
  4. 遍歷根節(jié)點(diǎn)下的子節(jié)點(diǎn): 使用內(nèi)層 for 循環(huán)遍歷當(dāng)前根節(jié)點(diǎn)下的所有子節(jié)點(diǎn),通過 child->child(y) 獲取子節(jié)點(diǎn)。
  5. 輸出子節(jié)點(diǎn): 使用 grandson->text(0).toStdString().data() 輸出當(dāng)前子節(jié)點(diǎn)的文本信息,并將其輸出到標(biāo)準(zhǔn)輸出流。
  6. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("枚舉所有節(jié)點(diǎn)"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),遍歷 QTreeWidget 中的所有節(jié)點(diǎn),輸出每個(gè)節(jié)點(diǎn)的文本信息,并將信息記錄到 QPlainTextEdit 中。

void MainWindow::on_pushButton_enumnode_clicked()
{
    // 獲取到全部的根節(jié)點(diǎn)數(shù)量
    int size = ui->treeWidget->topLevelItemCount();
    QTreeWidgetItem *child;
    for(int x=0;x<size;x++)
    {
        // 輸出所有父節(jié)點(diǎn)
        child = ui->treeWidget->topLevelItem(x);
        std::cout << "all root = "<< child->text(0).toStdString().data() << std::endl;

        // 得到所有子節(jié)點(diǎn)計(jì)數(shù)
        int childCount = child->childCount();
        // std::cout << "all child count = " << childCount << std::endl;

        // 輸出根節(jié)點(diǎn)下面的子節(jié)點(diǎn)
        for(int y=0;y<childCount;++y)
        {
            QTreeWidgetItem *grandson = child->child(y);
            std::cout << "--> sub child = "<< grandson->text(0).toStdString().data() << std::endl;

            ui->plainTextEdit->appendPlainText(grandson->text(0).toStdString().data());
        }
    }

    ui->plainTextEdit->appendPlainText("枚舉所有節(jié)點(diǎn)");
}

枚舉所有節(jié)點(diǎn)會(huì)將父節(jié)點(diǎn)與子節(jié)點(diǎn)一并輸出,如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.7 枚舉選中節(jié)點(diǎn)

如下槽函數(shù),其核心功能是遍歷 QTreeWidget 中的所有節(jié)點(diǎn),并輸出每個(gè)選中節(jié)點(diǎn)的文本信息。

以下是概述:

  1. 獲取全部的根節(jié)點(diǎn)數(shù)量: 使用 int size = ui->treeWidget->topLevelItemCount(); 獲取頂級(jí)父節(jié)點(diǎn)的數(shù)量。
  2. 遍歷所有根節(jié)點(diǎn): 使用 for 循環(huán)遍歷每一個(gè)根節(jié)點(diǎn),通過 ui->treeWidget->topLevelItem(x) 獲取當(dāng)前的根節(jié)點(diǎn)。
  3. 遍歷根節(jié)點(diǎn)下的子節(jié)點(diǎn): 使用內(nèi)層 for 循環(huán)遍歷當(dāng)前根節(jié)點(diǎn)下的所有子節(jié)點(diǎn),通過 child->child(y) 獲取子節(jié)點(diǎn)。
  4. 判斷是否選中: 使用 if(Qt::Checked == grandson->checkState(0)) 判斷當(dāng)前子節(jié)點(diǎn)是否被選中。
  5. 輸出選中節(jié)點(diǎn)信息: 如果子節(jié)點(diǎn)被選中,輸出當(dāng)前根節(jié)點(diǎn)與子節(jié)點(diǎn)的文本信息,并將信息輸出到標(biāo)準(zhǔn)輸出流。
  6. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("枚舉所有選中節(jié)點(diǎn)"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),遍歷 QTreeWidget 中的所有節(jié)點(diǎn),輸出每個(gè)被選中節(jié)點(diǎn)的文本信息,并將信息記錄到 QPlainTextEdit 中。

void MainWindow::on_pushButton_enumselectnode_clicked()
{
    // 獲取到全部的根節(jié)點(diǎn)數(shù)量
    int size = ui->treeWidget->topLevelItemCount();
    QTreeWidgetItem *child;
    for(int x=0;x<size;x++)
    {
        // 輸出所有父節(jié)點(diǎn)
        child = ui->treeWidget->topLevelItem(x);

        // 得到所有子節(jié)點(diǎn)計(jì)數(shù)
        int childCount = child->childCount();

        // 輸出根節(jié)點(diǎn)下面的子節(jié)點(diǎn)
        for(int y=0;y<childCount;++y)
        {
            QTreeWidgetItem *grandson = child->child(y);
            // 判斷是否選中,如果選中輸出父節(jié)點(diǎn)與子節(jié)點(diǎn)
            if(Qt::Checked == grandson->checkState(0))
            {
                std::cout << "root -> " << child->text(0).toStdString().data()
                          << "--> sub child = "<< grandson->text(0).toStdString().data() << std::endl;

                ui->plainTextEdit->appendPlainText(child->text(0).toStdString().data());
                ui->plainTextEdit->appendPlainText(grandson->text(0).toStdString().data());
            }
        }
    }

    ui->plainTextEdit->appendPlainText("枚舉所有選中節(jié)點(diǎn)");
}

枚舉所有選中的節(jié)點(diǎn),此處需要打上對(duì)勾才會(huì)生效,如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.8 獲取節(jié)點(diǎn)父節(jié)點(diǎn)

如下槽函數(shù),其核心功能是獲取當(dāng)前選中節(jié)點(diǎn)的父節(jié)點(diǎn)(如果存在),輸出父節(jié)點(diǎn)的序號(hào)和名字,并將信息記錄到 QPlainTextEdit 中。

以下是概述:

  1. 獲取當(dāng)前選中節(jié)點(diǎn)的父節(jié)點(diǎn): 使用 QTreeWidgetItem *currentItem = ui->treeWidget->currentItem()->parent(); 獲取當(dāng)前選中節(jié)點(diǎn)的父節(jié)點(diǎn)。
  2. 獲取父節(jié)點(diǎn)在頂級(jí)節(jié)點(diǎn)中的序號(hào): 使用 int root_count = ui->treeWidget->indexOfTopLevelItem(currentItem); 獲取父節(jié)點(diǎn)在頂級(jí)節(jié)點(diǎn)中的序號(hào)。
  3. 判斷是否存在父節(jié)點(diǎn): 使用 if(root_count != -1) 條件判斷,如果存在父節(jié)點(diǎn),執(zhí)行下面的操作;否則,直接返回。
  4. 獲取指定序號(hào)對(duì)應(yīng)的父節(jié)點(diǎn): 使用 child = ui->treeWidget->topLevelItem(root_count); 獲取指定序號(hào)對(duì)應(yīng)的父節(jié)點(diǎn)。
  5. 輸出父節(jié)點(diǎn)的序號(hào)和名字: 使用 std::cout << "root Count = " << root_count << std::endl; 輸出父節(jié)點(diǎn)在頂級(jí)節(jié)點(diǎn)中的序號(hào),以及 std::cout << "root name= "<< child->text(0).toStdString().data() << std::endl; 輸出父節(jié)點(diǎn)的名字。
  6. 記錄操作到 QPlainTextEdit 中: 使用 ui->plainTextEdit->appendPlainText("獲取父節(jié)點(diǎn)ID"); 將一行文本記錄添加到 QPlainTextEdit 中,用于記錄操作。

這段代碼的作用是在點(diǎn)擊按鈕時(shí),獲取當(dāng)前選中節(jié)點(diǎn)的父節(jié)點(diǎn)(如果存在),輸出父節(jié)點(diǎn)在頂級(jí)節(jié)點(diǎn)中的序號(hào)和名字,并將信息記錄到 QPlainTextEdit 中。

void MainWindow::on_pushButton_getnode_clicked()
{
    // 取所有的父節(jié)點(diǎn)
    QTreeWidgetItem *currentItem = ui->treeWidget->currentItem()->parent();
    int root_count = ui->treeWidget->indexOfTopLevelItem(currentItem);
    std::cout << "root Count = " <<  root_count << std::endl;
    if(root_count != -1)
    {
        // 指定序號(hào)對(duì)應(yīng)的父節(jié)點(diǎn)名字
        QTreeWidgetItem *child;

        child = ui->treeWidget->topLevelItem(root_count);
        std::cout << "root name= "<< child->text(0).toStdString().data() << std::endl;

        ui->plainTextEdit->appendPlainText(child->text(0).toStdString().data());
    }

    ui->plainTextEdit->appendPlainText("獲取父節(jié)點(diǎn)ID");
}

當(dāng)用戶選中一個(gè)子節(jié)點(diǎn)時(shí),可通過該槽函數(shù)獲取其父節(jié)點(diǎn)的ID編號(hào),如下圖;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

1.9 綁定右鍵菜單

在開發(fā)中我們經(jīng)常會(huì)把它當(dāng)作一個(gè)升級(jí)版的ListView組件使用,因?yàn)?code>ListView每次只能顯示一列數(shù)據(jù)集,而使用TableWidget組件顯示多列顯得不夠美觀,此時(shí)使用TreeWidget組件顯示單層結(jié)構(gòu)是最理想的方式,同時(shí)該組件同樣支持增加右鍵菜單,在真正的開發(fā)中尤為常用。

首先我們?cè)?code>MainWindow主窗體中只保留一個(gè)treeWidget組件,接著直接來到MainWindow構(gòu)造函數(shù)上,在該函數(shù)中我們通過動(dòng)態(tài)創(chuàng)建一個(gè)menuBar()并將其隱藏起來,接著將菜單屬性與treeWidget中的事件相互綁定,最后初始化填充一些測(cè)試數(shù)據(jù),其代碼如下;

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // -------------------------------------------------
    // 初始化組件菜單
    // -------------------------------------------------

    // 在MainWindow中使用右擊菜單需要添加此項(xiàng)
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    // 創(chuàng)建基礎(chǔ)頂部菜單
    QMenuBar *bar = menuBar();
    this->setMenuBar(bar);
    QMenu * fileMenu = bar->addMenu("菜單1");

    // 實(shí)現(xiàn)只隱藏菜單1其他的不受影響
    fileMenu->menuAction()->setVisible(false);

    // 添加子菜單
    GetColumnAction = fileMenu->addAction("獲取列號(hào)");
    GetRowDataAction = fileMenu->addAction("獲取本行數(shù)據(jù)");
    GetLineAction = fileMenu->addAction("獲取行號(hào)");

    // 分別設(shè)置圖標(biāo)
    GetColumnAction->setIcon(QIcon(":/image/1.ico"));
    GetRowDataAction->setIcon(QIcon(":/image/2.ico"));
    GetLineAction->setIcon(QIcon(":/image/3.ico"));

    // 為子菜單綁定熱鍵
    GetColumnAction->setShortcut(Qt::CTRL | Qt::Key_A);
    GetRowDataAction->setShortcut(Qt::SHIFT | Qt::Key_S);
    GetLineAction->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_B);

    // -------------------------------------------------
    // 綁定槽函數(shù)
    // -------------------------------------------------

    // 綁定槽函數(shù): 獲取選中列
    connect(GetColumnAction,&QAction::triggered,this,[=](){
        int col = ui->treeWidget->currentColumn();
        std::cout << col << std::endl;
    });

    // 綁定槽函數(shù): 獲取選中的第0行的數(shù)據(jù)內(nèi)容
    connect(GetRowDataAction,&QAction::triggered,this,[=](){
        QString msg = ui->treeWidget->currentItem()->text(0);
        std::cout << msg.toStdString().data() << std::endl;
    });

    // 綁定槽函數(shù): 獲取當(dāng)前選中的索引值
    connect(GetLineAction,&QAction::triggered,this,[=](){
        int row  = ui->treeWidget->currentIndex().row();
        std::cout << row << std::endl;
    });

    // -------------------------------------------------
    // 設(shè)置屬性填充數(shù)據(jù)
    // -------------------------------------------------

    // 設(shè)置treeWidget屬性
    ui->treeWidget->setColumnCount(4);         // 設(shè)置總列數(shù)
    ui->treeWidget->setColumnWidth(0,300);     // 設(shè)置最后一列寬度自適應(yīng)
    ui->treeWidget->setIndentation(1);         // 設(shè)置表頭縮進(jìn)為1

    // 設(shè)置表頭數(shù)據(jù)
    QStringList headers;
    headers.append("文件名");
    headers.append("更新時(shí)間");
    headers.append("文件類型");
    headers.append("文件大小");
    ui->treeWidget->setHeaderLabels(headers);

    // 模擬插入數(shù)據(jù)到表中
    for(int x=0;x<100;x++)
    {
        QTreeWidgetItem* item=new QTreeWidgetItem();
        item->setText(0,"《LyShark 從入門到精通》");
        item->setIcon(0,QIcon(":/image/1.ico"));
        item->setText(1,"2023-12-17");
        item->setText(2,"*.pdf");
        item->setText(3,"102MB");
        item->setIcon(3,QIcon(":/image/2.ico"));
        ui->treeWidget->addTopLevelItem(item);
    }
}

此時(shí),當(dāng)treeWidget中的右鍵被點(diǎn)擊后則將觸發(fā)on_treeWidget_customContextMenuRequested槽函數(shù),此函數(shù)中動(dòng)態(tài)的新建一個(gè)菜單,并在鼠標(biāo)點(diǎn)擊位置將其顯示輸出,代碼如下;

// 當(dāng)treeWidget中的右鍵被點(diǎn)擊時(shí)則觸發(fā)
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
    std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;
    Q_UNUSED(pos);

    // 新建Menu菜單
    QMenu *ptr = new QMenu(this);

    // 添加Actions創(chuàng)建菜單項(xiàng)
    ptr->addAction(GetColumnAction);
    ptr->addAction(GetLineAction);

    // 添加一個(gè)分割線
    ptr->addSeparator();
    ptr->addAction(GetRowDataAction);

    // 在鼠標(biāo)光標(biāo)位置顯示右鍵快捷菜單
    ptr->exec(QCursor::pos());
    // 手工創(chuàng)建的指針必須手工刪除
    delete ptr;
}

運(yùn)行后讀者可看到如下圖所示的輸出效果;

C++ Qt開發(fā):TreeWidget 樹形選擇組件

完整案例下載文章來源地址http://www.zghlxwxcb.cn/news/detail-760189.html

到了這里,關(guān)于C++ Qt開發(fā):TreeWidget 樹形選擇組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++ Qt開發(fā):PushButton按鈕組件

    C++ Qt開發(fā):PushButton按鈕組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 QPushButton 按鈕組件的常用方法及靈活運(yùn)用。 QPushButton 是 Qt 框架中用于創(chuàng)建按鈕

    2024年02月05日
    瀏覽(23)
  • C++ Qt 開發(fā):ListWidget列表框組件

    C++ Qt 開發(fā):ListWidget列表框組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 ListWidget 列表框組件的常用方法及靈活運(yùn)用。 QListWidget 是 Qt 中的一個(gè)列表框組

    2024年02月04日
    瀏覽(23)
  • C++ Qt開發(fā):MdiArea多窗體組件

    C++ Qt開發(fā):MdiArea多窗體組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 MdiArea 組件的常用方法及靈活運(yùn)用。 QMdiArea(Multiple Document Interface Area)是Qt中

    2024年02月04日
    瀏覽(18)
  • C++ Qt開發(fā):SqlRelationalTable關(guān)聯(lián)表組件

    C++ Qt開發(fā):SqlRelationalTable關(guān)聯(lián)表組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 SqlRelationalTable 關(guān)聯(lián)表組件的常用方法及靈活運(yùn)用。 在上一篇文章中詳細(xì)介紹了

    2024年02月04日
    瀏覽(22)
  • C++ Qt開發(fā):DateTime日期時(shí)間組件

    C++ Qt開發(fā):DateTime日期時(shí)間組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 QDateTime 日期與時(shí)間組件的常用方法及靈活運(yùn)用。 在Qt中,日期和時(shí)間的處理通

    2024年02月04日
    瀏覽(27)
  • C++ Qt開發(fā):Charts繪圖組件概述

    C++ Qt開發(fā):Charts繪圖組件概述

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 QCharts 二維繪圖組件的常用方法及靈活運(yùn)用。 Qt Charts 提供了一個(gè)強(qiáng)大且易于使

    2024年02月04日
    瀏覽(29)
  • C++ Qt開發(fā):SqlTableModel映射組件應(yīng)用

    C++ Qt開發(fā):SqlTableModel映射組件應(yīng)用

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 SqlTableModule 組件的常用方法及靈活運(yùn)用。 在多數(shù)情況下我們需要使用SQL的方法

    2024年02月04日
    瀏覽(23)
  • C++ Qt開發(fā):QNetworkAccessManager網(wǎng)絡(luò)接口組件

    C++ Qt開發(fā):QNetworkAccessManager網(wǎng)絡(luò)接口組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹如何運(yùn)用 QNetworkAccessManager 組件實(shí)現(xiàn)Web網(wǎng)頁訪問。 QNetworkAccessManager是Qt網(wǎng)絡(luò)模塊

    2024年03月12日
    瀏覽(25)
  • C++ Qt開發(fā):ProgressBar進(jìn)度條組件

    C++ Qt開發(fā):ProgressBar進(jìn)度條組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹 ProgressBar 進(jìn)度條組件的常用方法及靈活運(yùn)用。 ProgressBar(進(jìn)度條)是在Qt中常用

    2024年02月04日
    瀏覽(21)
  • C++ Qt開發(fā):QFileSystemWatcher文件監(jiān)視組件

    Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫(kù),利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹如何運(yùn)用 QFileSystemWatcher 組件實(shí)現(xiàn)對(duì)文件或目錄的監(jiān)視功能。 QFileSystemWatcher 是

    2024年03月09日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包