<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
關於QTreeWidget隱藏節點有兩種方式,一種是直接隱藏,一種是間接隱藏,但是兩種方式各有差異,下面請聽具體解說。
Qt助手裡面提供了QTreeWidgetItem::setHidden方法,我們可以呼叫setHide(false)直接隱藏當前item。但是呼叫此方法會隱藏該節點下面的所有子節點。
圖 1-1:
我們通過圖1-2看到,呼叫此方法會將自己所有的孩子節點都給隱藏了,如果有這種需求的直接呼叫此方法即可。
效果圖 1-2:
此種方法間接地去把節點隱藏起來,實際上節點還是存在的,只不過肉眼不可見。通過嘗試了很多種方法,最後找到了幾種組合式呼叫,將節點悄悄藏起來了。
上程式碼:
// 這裡我們預設樹的節點只有一列; 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節點進行設定文字,那第一步就不需要清空文字了,如果是前期需要顯示,但是後期想不顯示,需要先清空節點本身的文字,然後我們給節點設定大小為(1, 1),至於為什麼設定(1, 1)而不是(0, 0),後面會舉例說明,因為我們設定了大小為(1, 1),但是設定之後我們發現該節點左側的小箭頭還是存在的,為了去除小箭頭,我們需要再給節點加上 Qt::ItemNeverHasChildren標誌,就是告訴節點,你沒有孩子節點,不要去顯示小箭頭了。
我們看到圖2-1中就是沒有告訴節點沒有孩子,結果節點是不顯示了,小箭頭還是顯示,雖然我們設定了大小(1,1),其實已經很小了,節點本身應該是不可見了,但是你沒告訴他沒孩子,那他依然顯示沒毛病,所以我們需要再設定標誌位Qt::ItemNeverHasChildren,顯式地告訴該節點,你沒有孩子,你的小箭頭就收起來吧O(∩_∩)O。
效果圖 2-1:
通過圖2-2,我們看到小箭頭確實消失了。我們看程式碼的最後兩行,這裡進行了測試,輸出為false,說明實際上節點還是存在的,只是我們通過特殊的方法將它藏起來了。
效果圖 2-2:
下面我們探討一下為啥不直接將item的大小設定為(0, 0),我們直接看效果就好了。
注意:
下方我們把大小改為了(0, 0),我們來對比圖2-3和圖2-4,仔細看看有什麼不同。
首先兩張圖的按鈕操作程式碼是一樣的,仔細看效果圖2-3我們點選按鈕,隱藏節點之後,整個樹結構是沒有問題的,我們再看下圖2-4我們發現,樹上的節點變多了,點選按鈕之後,在上下拖拽卷軸時我們發現節點會有顯示錯亂的問題。
效果圖 2-3
效果圖 2-4
為什麼程式碼一樣,結果不一樣呢,這是我們樹上的節點不一樣了,圖2-5中我們操作的節點Root1上方還有一個Root0節點,且Root1的孩子節點不多,導致卷軸沒有出來,我自己也是經過多次測試,出現上圖2-4這種錯亂的問題,需兩個條件,一個是操作的節點Root1位於樹的第一個根節點,第二是樹上的節點數目足夠多(出現卷軸),不一定是Root1節點的孩子節點多導致,Root2節點過多也會導致顯示錯亂的問題,所以通過多次測試,我們放棄大小(0, 0)這種方式,,改為(1, 1)即可正常顯示。
有人問那(1, 0)或者(0, 1)可以嗎?
經測試(1, 0)不行,(0, 1)可以,問題在高度不能為0,有興趣的小夥伴可以自己進行一個測試,下方提供了原始碼。
如果小夥伴們在運用過程中使用了樣式表或者給item設定了widget,出現了新的問題歡迎一起討論交流。
效果圖 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("隱藏根節點"); 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; }
以上是前段時間幫同事解決的一個小問題,其實問題很簡單,解決的程式碼就那麼幾行,但是為了寫這篇部落格,我專門寫了一個例子,進行了多次測試,結合各種引數對比和效果圖,為的是希望看到的小夥伴能夠更容易看懂和理解,本來一個小時可以寫完的,為了詳細點同時也為了驗證正確性,防止小夥伴誤解花了幾個小時時間準備例子、測試結果及分析講解,編碼不易,寫部落格也是對自己的一個挑戰,不論是耐心,還是細心。我覺得作為一個合格的程式設計師應該對自己有點要求,遇到問題我們需要自己不斷地去進行驗證,拓展,不能全信網上提供的資料,更多的是需要自己花時間研究,驗證,將別人的內容能夠更好地吸收。
到此這篇關於詳解QTreeWidget隱藏節點的兩種方式的文章就介紹到這了,更多相關QTreeWidget隱藏節點內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45