欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式

 更新時(shí)間:2022年03月17日 09:18:07   作者:前行中的小豬  
本文主要介紹了QTreeWidget隱藏節(jié)點(diǎn)的兩種方式,一種是直接隱藏,一種是間接隱藏,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)述

關(guān)于QTreeWidget隱藏節(jié)點(diǎn)有兩種方式,一種是直接隱藏,一種是間接隱藏,但是兩種方式各有差異,下面請(qǐng)聽具體解說。

方法一:直接隱藏式

Qt助手里面提供了QTreeWidgetItem::setHidden方法,我們可以調(diào)用setHide(false)直接隱藏當(dāng)前item。但是調(diào)用此方法會(huì)隱藏該節(jié)點(diǎn)下面的所有子節(jié)點(diǎn)。

圖 1-1:

在這里插入圖片描述

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

效果圖 1-2:

在這里插入圖片描述

方法二:間接隱藏式

此種方法間接地去把節(jié)點(diǎn)隱藏起來,實(shí)際上節(jié)點(diǎn)還是存在的,只不過肉眼不可見。通過嘗試了很多種方法,最后找到了幾種組合式調(diào)用,將節(jié)點(diǎn)悄悄藏起來了。

上代碼:

	// 這里我們默認(rèn)樹的節(jié)點(diǎn)只有一列;
	m_rootItem->setText(0, "");
	m_rootItem->setSizeHint(0, QSize(1, 1));
	Qt::ItemFlags flags = m_rootItem->flags();
	m_rootItem->setFlags(flags | Qt::ItemNeverHasChildren);

如果我們初始化的時(shí)候就沒給m_rootItem節(jié)點(diǎn)進(jìn)行設(shè)置文本,那第一步就不需要清空文本了,如果是前期需要顯示,但是后期想不顯示,需要先清空節(jié)點(diǎn)本身的文本,然后我們給節(jié)點(diǎn)設(shè)置大小為(1, 1),至于為什么設(shè)置(1, 1)而不是(0, 0),后面會(huì)舉例說明,因?yàn)槲覀冊(cè)O(shè)置了大小為(1, 1),但是設(shè)置之后我們發(fā)現(xiàn)該節(jié)點(diǎn)左側(cè)的小箭頭還是存在的,為了去除小箭頭,我們需要再給節(jié)點(diǎn)加上 Qt::ItemNeverHasChildren標(biāo)志,就是告訴節(jié)點(diǎn),你沒有孩子節(jié)點(diǎn),不要去顯示小箭頭了。

我們看到圖2-1中就是沒有告訴節(jié)點(diǎn)沒有孩子,結(jié)果節(jié)點(diǎn)是不顯示了,小箭頭還是顯示,雖然我們?cè)O(shè)置了大小(1,1),其實(shí)已經(jīng)很小了,節(jié)點(diǎn)本身應(yīng)該是不可見了,但是你沒告訴他沒孩子,那他依然顯示沒毛病,所以我們需要再設(shè)置標(biāo)志位Qt::ItemNeverHasChildren,顯式地告訴該節(jié)點(diǎn),你沒有孩子,你的小箭頭就收起來吧O(∩_∩)O。

效果圖 2-1:

在這里插入圖片描述

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

效果圖 2-2:

在這里插入圖片描述

下面我們探討一下為啥不直接將item的大小設(shè)置為(0, 0),我們直接看效果就好了。

注意:

下方我們把大小改為了(0, 0),我們來對(duì)比圖2-3和圖2-4,仔細(xì)看看有什么不同。
首先兩張圖的按鈕操作代碼是一樣的,仔細(xì)看效果圖2-3我們點(diǎn)擊按鈕,隱藏節(jié)點(diǎn)之后,整個(gè)樹結(jié)構(gòu)是沒有問題的,我們?cè)倏聪聢D2-4我們發(fā)現(xiàn),樹上的節(jié)點(diǎn)變多了,點(diǎn)擊按鈕之后,在上下拖拽滾動(dòng)條時(shí)我們發(fā)現(xiàn)節(jié)點(diǎn)會(huì)有顯示錯(cuò)亂的問題。

效果圖 2-3

在這里插入圖片描述

效果圖 2-4

在這里插入圖片描述

為什么代碼一樣,結(jié)果不一樣呢,這是我們樹上的節(jié)點(diǎn)不一樣了,圖2-5中我們操作的節(jié)點(diǎn)Root1上方還有一個(gè)Root0節(jié)點(diǎn),且Root1的孩子節(jié)點(diǎn)不多,導(dǎo)致滾動(dòng)條沒有出來,我自己也是經(jīng)過多次測(cè)試,出現(xiàn)上圖2-4這種錯(cuò)亂的問題,需兩個(gè)條件,一個(gè)是操作的節(jié)點(diǎn)Root1位于樹的第一個(gè)根節(jié)點(diǎn),第二是樹上的節(jié)點(diǎn)數(shù)目足夠多(出現(xiàn)滾動(dòng)條),不一定是Root1節(jié)點(diǎn)的孩子節(jié)點(diǎn)多導(dǎo)致,Root2節(jié)點(diǎn)過多也會(huì)導(dǎo)致顯示錯(cuò)亂的問題,所以通過多次測(cè)試,我們放棄大小(0, 0)這種方式,,改為(1, 1)即可正常顯示。

有人問那(1, 0)或者(0, 1)可以嗎?
經(jīng)測(cè)試(1, 0)不行,(0, 1)可以,問題在高度不能為0,有興趣的小伙伴可以自己進(jìn)行一個(gè)測(cè)試,下方提供了源碼。

如果小伙伴們?cè)谶\(yù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é)點(diǎn)");

	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é)尾

以上是前段時(shí)間幫同事解決的一個(gè)小問題,其實(shí)問題很簡(jiǎn)單,解決的代碼就那么幾行,但是為了寫這篇博客,我專門寫了一個(gè)例子,進(jìn)行了多次測(cè)試,結(jié)合各種參數(shù)對(duì)比和效果圖,為的是希望看到的小伙伴能夠更容易看懂和理解,本來一個(gè)小時(shí)可以寫完的,為了詳細(xì)點(diǎn)同時(shí)也為了驗(yàn)證正確性,防止小伙伴誤解花了幾個(gè)小時(shí)時(shí)間準(zhǔn)備例子、測(cè)試結(jié)果及分析講解,編碼不易,寫博客也是對(duì)自己的一個(gè)挑戰(zhàn),不論是耐心,還是細(xì)心。我覺得作為一個(gè)合格的程序員應(yīng)該對(duì)自己有點(diǎn)要求,遇到問題我們需要自己不斷地去進(jìn)行驗(yàn)證,拓展,不能全信網(wǎng)上提供的資料,更多的是需要自己花時(shí)間研究,驗(yàn)證,將別人的內(nèi)容能夠更好地吸收。

到此這篇關(guān)于詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式的文章就介紹到這了,更多相關(guān)QTreeWidget隱藏節(jié)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MFC實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    MFC實(shí)現(xiàn)簡(jiǎn)單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言實(shí)現(xiàn)頁面置換 先進(jìn)先出算法(FIFO)

    C語言實(shí)現(xiàn)頁面置換 先進(jìn)先出算法(FIFO)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)頁面置換,先進(jìn)先出算法(FIFO),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • c語言 深入理解函數(shù)的遞歸

    c語言 深入理解函數(shù)的遞歸

    這一章講解的是函數(shù)的遞歸,因?yàn)檫f歸函數(shù)是一個(gè)非常重要求解復(fù)雜問題的方法之一,在學(xué)習(xí)算法的過程之中我們也會(huì)遇到他,所以我想對(duì)它進(jìn)行一次講解,希望能幫助其他人,也能幫助我自己來梳理一遍。下面我會(huì)通過一些題目的講解去認(rèn)識(shí)遞歸函數(shù)
    2022-02-02
  • 詳解Dijkstra算法之最短路徑問題

    詳解Dijkstra算法之最短路徑問題

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。本文將介紹其原理,并用C++實(shí)現(xiàn)
    2021-06-06
  • C++編寫生成不重復(fù)的隨機(jī)數(shù)代碼

    C++編寫生成不重復(fù)的隨機(jī)數(shù)代碼

    本文給大家匯總介紹了3種c++實(shí)現(xiàn)生成不重復(fù)的隨機(jī)數(shù)的函數(shù),十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱

    C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱

    本文主要介紹了C++獲取當(dāng)前正在運(yùn)行函數(shù)的名稱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C++中volatile和mutable關(guān)鍵字用法詳解

    C++中volatile和mutable關(guān)鍵字用法詳解

    這篇文章主要介紹了C++中volatile和mutable關(guān)鍵字用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 配置CLion管理Qt項(xiàng)目國(guó)際化支持的方法

    配置CLion管理Qt項(xiàng)目國(guó)際化支持的方法

    這篇文章主要介紹了配置CLion管理Qt項(xiàng)目國(guó)際化支持的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹的操作

    C語言數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析二叉樹的操作

    二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來說,最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下
    2022-04-04
  • 一文帶你快速了解C/C++標(biāo)準(zhǔn)庫(kù)中的ptrdiff_t

    一文帶你快速了解C/C++標(biāo)準(zhǔn)庫(kù)中的ptrdiff_t

    ptrdiff_t是C/C++標(biāo)準(zhǔn)庫(kù)中定義的一個(gè)與機(jī)器相關(guān)的數(shù)據(jù)類型,ptrdiff_t類型變量通常用來保存兩個(gè)指針減法操作的結(jié)果,下面這篇文章主要給大家介紹了關(guān)于C/C++標(biāo)準(zhǔn)庫(kù)中ptrdiff_t的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評(píng)論