詳解QTreeWidget隱藏節(jié)點的兩種方式
簡述
關(guān)于QTreeWidget隱藏節(jié)點有兩種方式,一種是直接隱藏,一種是間接隱藏,但是兩種方式各有差異,下面請聽具體解說。
方法一:直接隱藏式
Qt助手里面提供了QTreeWidgetItem::setHidden方法,我們可以調(diào)用setHide(false)直接隱藏當(dāng)前item。但是調(diào)用此方法會隱藏該節(jié)點下面的所有子節(jié)點。
圖 1-1:

我們通過圖1-2看到,調(diào)用此方法會將自己所有的孩子節(jié)點都給隱藏了,如果有這種需求的直接調(diào)用此方法即可。
效果圖 1-2:

方法二:間接隱藏式
此種方法間接地去把節(jié)點隱藏起來,實際上節(jié)點還是存在的,只不過肉眼不可見。通過嘗試了很多種方法,最后找到了幾種組合式調(diào)用,將節(jié)點悄悄藏起來了。
上代碼:
// 這里我們默認(rèn)樹的節(jié)點只有一列; m_rootItem->setText(0, ""); m_rootItem->setSizeHint(0, QSize(1, 1)); Qt::ItemFlags flags = m_rootItem->flags(); m_rootItem->setFlags(flags | Qt::ItemNeverHasChildren);
如果我們初始化的時候就沒給m_rootItem節(jié)點進(jìn)行設(shè)置文本,那第一步就不需要清空文本了,如果是前期需要顯示,但是后期想不顯示,需要先清空節(jié)點本身的文本,然后我們給節(jié)點設(shè)置大小為(1, 1),至于為什么設(shè)置(1, 1)而不是(0, 0),后面會舉例說明,因為我們設(shè)置了大小為(1, 1),但是設(shè)置之后我們發(fā)現(xiàn)該節(jié)點左側(cè)的小箭頭還是存在的,為了去除小箭頭,我們需要再給節(jié)點加上 Qt::ItemNeverHasChildren標(biāo)志,就是告訴節(jié)點,你沒有孩子節(jié)點,不要去顯示小箭頭了。
我們看到圖2-1中就是沒有告訴節(jié)點沒有孩子,結(jié)果節(jié)點是不顯示了,小箭頭還是顯示,雖然我們設(shè)置了大小(1,1),其實已經(jīng)很小了,節(jié)點本身應(yīng)該是不可見了,但是你沒告訴他沒孩子,那他依然顯示沒毛病,所以我們需要再設(shè)置標(biāo)志位Qt::ItemNeverHasChildren,顯式地告訴該節(jié)點,你沒有孩子,你的小箭頭就收起來吧O(∩_∩)O。
效果圖 2-1:

通過圖2-2,我們看到小箭頭確實消失了。我們看代碼的最后兩行,這里進(jìn)行了測試,輸出為false,說明實際上節(jié)點還是存在的,只是我們通過特殊的方法將它藏起來了。
效果圖 2-2:

下面我們探討一下為啥不直接將item的大小設(shè)置為(0, 0),我們直接看效果就好了。
注意:
下方我們把大小改為了(0, 0),我們來對比圖2-3和圖2-4,仔細(xì)看看有什么不同。
首先兩張圖的按鈕操作代碼是一樣的,仔細(xì)看效果圖2-3我們點擊按鈕,隱藏節(jié)點之后,整個樹結(jié)構(gòu)是沒有問題的,我們再看下圖2-4我們發(fā)現(xiàn),樹上的節(jié)點變多了,點擊按鈕之后,在上下拖拽滾動條時我們發(fā)現(xiàn)節(jié)點會有顯示錯亂的問題。
效果圖 2-3

效果圖 2-4

為什么代碼一樣,結(jié)果不一樣呢,這是我們樹上的節(jié)點不一樣了,圖2-5中我們操作的節(jié)點Root1上方還有一個Root0節(jié)點,且Root1的孩子節(jié)點不多,導(dǎo)致滾動條沒有出來,我自己也是經(jīng)過多次測試,出現(xiàn)上圖2-4這種錯亂的問題,需兩個條件,一個是操作的節(jié)點Root1位于樹的第一個根節(jié)點,第二是樹上的節(jié)點數(shù)目足夠多(出現(xiàn)滾動條),不一定是Root1節(jié)點的孩子節(jié)點多導(dǎo)致,Root2節(jié)點過多也會導(dǎo)致顯示錯亂的問題,所以通過多次測試,我們放棄大?。?, 0)這種方式,,改為(1, 1)即可正常顯示。
有人問那(1, 0)或者(0, 1)可以嗎?
經(jīng)測試(1, 0)不行,(0, 1)可以,問題在高度不能為0,有興趣的小伙伴可以自己進(jìn)行一個測試,下方提供了源碼。
如果小伙伴們在運用過程中使用了樣式表或者給item設(shè)置了widget,出現(xiàn)了新的問題歡迎一起討論交流。
效果圖 2-5

效果圖 2-6

代碼之路 .h文件
#include <QtWidgets/QWidget>
#include <QTreeWidget>
#include <QToolButton>
class MyTreeWidget : public QWidget
{
Q_OBJECT
public:
MyTreeWidget(QWidget *parent = Q_NULLPTR);
private:
void initWgt();
void initTreeData();
private slots:
void onBtnClicked();
private:
QTreeWidget* m_treeWgt;
QToolButton* m_pBtnControl;
QTreeWidgetItem* m_rootItem;
};
.cpp文件
#include "MyTreeWidget.h"
#include <QVBoxLayout>
#include <QDebug>
#pragma execution_character_set("utf-8")
MyTreeWidget::MyTreeWidget(QWidget *parent)
: QWidget(parent)
{
initWgt();
initTreeData();
}
void MyTreeWidget::initWgt()
{
m_treeWgt = new QTreeWidget;
m_treeWgt->setHeaderHidden(true);
m_pBtnControl = new QToolButton;
m_pBtnControl->setText("隱藏根節(jié)點");
QVBoxLayout* vLayout = new QVBoxLayout(this);
vLayout->addWidget(m_treeWgt);
vLayout->addWidget(m_pBtnControl);
connect(m_pBtnControl, &QToolButton::clicked, this, &MyTreeWidget::onBtnClicked);
}
void MyTreeWidget::initTreeData()
{
QTreeWidgetItem* m_rootItem1 = new QTreeWidgetItem(m_treeWgt);
m_rootItem1->setText(0, "Root0");
m_rootItem = new QTreeWidgetItem(m_treeWgt);
m_rootItem->setText(0, "Root1");
QTreeWidgetItem* item1 = new QTreeWidgetItem(m_rootItem);
item1->setText(0, "Node1");
QTreeWidgetItem* item2 = new QTreeWidgetItem(m_rootItem);
item2->setText(0, "Node2");
QTreeWidgetItem* item21 = new QTreeWidgetItem(item2);
item21->setText(0, "Node21");
QTreeWidgetItem* item22 = new QTreeWidgetItem(item2);
item22->setText(0, "Node22");
QTreeWidgetItem* item3 = new QTreeWidgetItem(m_rootItem);
item3->setText(0, "Node3");
QTreeWidgetItem* item31 = new QTreeWidgetItem(item3);
item31->setText(0, "Node31");
QTreeWidgetItem* item32 = new QTreeWidgetItem(item3);
item32->setText(0, "Node32");
for (int i = 0; i < 10; i++)
{
QTreeWidgetItem* item = new QTreeWidgetItem(m_rootItem);
item->setText(0, "Node");
}
m_rootItem->setExpanded(true);
QTreeWidgetItem* itemTmp = new QTreeWidgetItem(m_treeWgt);
itemTmp->setText(0, "Root2");
QTreeWidgetItem* itemTmp1 = new QTreeWidgetItem(itemTmp);
itemTmp1->setText(0, "NodeTmp");
}
void MyTreeWidget::onBtnClicked()
{
// 直接隱藏;
// bool isHide = m_rootItem->isHidden();
// m_rootItem->setHidden(!isHide);
// 間接隱藏;
m_rootItem->setText(0, "");
m_rootItem->setSizeHint(0, QSize(0, 0));
Qt::ItemFlags flags = m_rootItem->flags();
m_rootItem->setFlags(flags | Qt::ItemNeverHasChildren);
bool isHide = m_rootItem->isHidden();
qDebug() << isHide;
}
結(jié)尾
以上是前段時間幫同事解決的一個小問題,其實問題很簡單,解決的代碼就那么幾行,但是為了寫這篇博客,我專門寫了一個例子,進(jìn)行了多次測試,結(jié)合各種參數(shù)對比和效果圖,為的是希望看到的小伙伴能夠更容易看懂和理解,本來一個小時可以寫完的,為了詳細(xì)點同時也為了驗證正確性,防止小伙伴誤解花了幾個小時時間準(zhǔn)備例子、測試結(jié)果及分析講解,編碼不易,寫博客也是對自己的一個挑戰(zhàn),不論是耐心,還是細(xì)心。我覺得作為一個合格的程序員應(yīng)該對自己有點要求,遇到問題我們需要自己不斷地去進(jìn)行驗證,拓展,不能全信網(wǎng)上提供的資料,更多的是需要自己花時間研究,驗證,將別人的內(nèi)容能夠更好地吸收。
到此這篇關(guān)于詳解QTreeWidget隱藏節(jié)點的兩種方式的文章就介紹到這了,更多相關(guān)QTreeWidget隱藏節(jié)點內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)交鶖?shù)排序
這篇文章主要介紹了C語言中數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)交鶖?shù)排序的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09

