QT使用QTreeWidget控件制作多级折叠菜单

这篇具有很好参考价值的文章主要介绍了QT使用QTreeWidget控件制作多级折叠菜单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录项目中实际用到的多级折叠菜单实现方式:项目代码简化版(亲测可用

开发环境:VS2015+QT5.9.1

多级菜单(左右共两个图标,中间为文字,左图标为固定静态图标,右图标为折叠/展开动态图标),格式如下:图片 菜单标题      图片

         QT使用QTreeWidget控件制作多级折叠菜单 系统配置         ∨

                     基本配置

                     时间配置

         QT使用QTreeWidget控件制作多级折叠菜单记录管理           >

步骤如下(QTreeWidget布局自行实现):

(1)UI设计师中Qwidget中拖入QTreeWidget控件,将对象名称更改为treeMenuWidget

        然后,在代码中设置隐藏根节点,如下方式2选1

         ui->treeMenuWidget->header()->setVisible(false);      //FastConfForm.cpp文件中代码隐藏方式

Or

        treeMenuWidget->header()->setVisible(false); ui_FastConfForm.h中代码隐藏方式

(2)FastConfForm.cpp,在根节点下使用代码方式创建多个2级和3级节点(根为第1级节点)

/*FastConfForm.cpp*/

//构造函数中主代码
FastConfForm::FastConfForm(QWidget *parent):
    ui(new Ui::FastConfForm)
{
ui->treeMenuWidget->setColumnWidth(0, 143);				//设置TreeItem元素宽度
ui->treeMenuWidget->setLayoutDirection(Qt::RightToLeft);//对其方式设置:右对齐


//TreeItem右侧图标
QIcon icon;
icon.addPixmap(QPixmap(":/image/pic/tab/Blu_selected.png"), QIcon::Selected, QIcon::Off);
icon.addPixmap(QPixmap(":/image/pic/tab/Blu_nomrmal.png"), QIcon::Selected, QIcon::On);


//新增TreeMenu的二级子节点:配置管理
//QTreeWidgetItem *wItemSysConf = new QTreeWidgetItem(ui->treeMenuWidget,QStringList(QStringLiteral("系统配置")),0);
QTreeWidgetItem *wItemSysConf = new QTreeWidgetItem(ui->treeMenuWidget, nullptr, 0);
wItemSysConf->setIcon(0, icon);			//添加右侧图标
wItemSysConf->setTextAlignment(0, Qt::AlignRight);
QTreeWidgetItem *wItemSysConf_Base  = new QTreeWidgetItem(wItemSysConf, QStringList(QStringLiteral("基本配置")), 1);
QTreeWidgetItem *wItemSysConf_Time = new QTreeWidgetItem(wItemSysConf, QStringList(QStringLiteral("时间配置")), 2);
wItemSysConf->addChild(wItemSysConf_Base  );			//添加三级子节点
wItemSysConf->addChild(wItemSysConf_Time);			//添加三级子节点
wItemSysConf_Base->setTextAlignment(0, Qt::AlignHCenter);
wItemSysConf_Time->setTextAlignment(0, Qt::AlignHCenter);



//新增TreeMenu的二级子节点:记录管理
//QTreeWidgetItem *wItemRecordMgt = new QTreeWidgetItem(ui->treeMenuWidget, QStringList(QStringLiteral("记录管理")),3);
QTreeWidgetItem *wItemRecordMgt = new QTreeWidgetItem(ui->treeMenuWidget, nullptr, 3);
wItemParkMgt->setIcon(0, icon);				  //添加右侧图标
wItemParkMgt->setTextAlignment(0, Qt::AlignRight);


//添加槽函数【槽函数需要在.h文件中声明】
connect(ui->treeMenuWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(showSelectedWidget(QTreeWidgetItem*, int)));


    //设置2级菜单的左侧图标和文件
    setLeftIconAndText(":/image/pic/tab/Blu_nomrmal.png", QString(QStringLiteral("系统配置")), wItemSysConf );
    setLeftIconAndText(":/image/pic/tab/Blu_nomrmal.png", QString(QStringLiteral("记录管理")), wItemRecordMgt );

    //展开默认节点
    expandMenu2Item(wItemSysConf , wItemSysConf_Base  , true);
}


//设置TreeItem的左侧图标和文字
void FastConfForm::setLeftIconAndText(QString strIconPath, QString strText, QTreeWidgetItem *treeWItem2)
{
	QWidget *userStateIcons = new QWidget();
	QHBoxLayout *hLayout = new QHBoxLayout();

	QLabel *m_pLabel = new QLabel();
	QLabel *m_pLabelPic = new QLabel();
	m_pLabel->setFixedSize(98, 20);
	m_pLabel->setText(strText);
	m_pLabelPic->setFixedSize(20, 20);
    m_pLabelPic->setPixmap(QPixmap(strIconPath).scaled(m_pLabel->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
	m_pLabelPic->setScaledContents(true);
    hLayout->addSpacing(0);
	hLayout->addStretch(0);
	hLayout->setContentsMargins(0, 0, 0, 0);
	hLayout->addWidget(m_pLabel);
    hLayout->addWidget(m_pLabelPic);
	userStateIcons->setLayout(hLayout);
	ui->treeMenuWidget->setItemWidget(treeWItem2, 0, userStateIcons);	//Item添加Widget窗口
}


//单击Tree节点处理(点击:展开/折叠)函数
void FastConfForm::showSelectedWidget(QTreeWidgetItem* item, int column)
{
    //添加调试打印 需要包含头文件《QDebug》 + 设为控制台输出("调试"-->选择“属性”-->选怎“连接器”-->选怎“系统”-->“子系统”中选择[控制台]),方便调试
	qDebug() << "==";
	curTreeMenu2Val = item->type(); //new QTreeWidgetItem()的第三个参数

    
	QTreeWidgetItem *parent = item->parent();   //获取父节点
	if (NULL != parent) //注意:最顶端项是没有父节点的(根节点隐藏: 二级节点也无父节点)
	{
		curTreeMenu3Val = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)
	}
    else 
	{
        //展开当前二级节点
		QTreeWidgetItem *firstChild = item->child(0);
		expandMenu2Item(item, firstChild, true);
	}
}


//节点展开的处理函数
void FastConfForm::expandMenu2Item(QTreeWidgetItem* itemMenu2, QTreeWidgetItem* itemMenu3, bool bIsSelect)
{
	itemMenu2->isExpanded() ? itemMenu2->setExpanded(false) : itemMenu2->setExpanded(true);

	if (NULL != itemMenu3)
	{
		selectMenu3Item(itemMenu3, bIsSelect);
		if (true == bIsSelect)
		{
			itemMenu2->setSelected(false);
		}
	}
}


//节点是否被选中处理
void FastConfForm::selectMenu3Item(QTreeWidgetItem* item, bool bIsSelect)
{
	item->setSelected(bIsSelect);
}

(3)FastConfForm.h主要函数和变量的声明

class FastConfForm : public QWidget
{
    Q_OBJECT


public:
    explicit FastConfForm(QWidget *parent = 0);
    ~FastConfForm();
    void setLeftIconAndText(QString strIconPath, QString strText, QTreeWidgetItem *treeWItem2);
	void expandMenu2Item(QTreeWidgetItem* itemMenu2, QTreeWidgetItem* itemMenu3, bool bIsSelect);
	void selectMenu3Item(QTreeWidgetItem* item, bool bIsSelect);


//槽函数声明方式
private slots:
	void showSelectedWidget(QTreeWidgetItem *, int);


private:
    Ui::FastConfForm *ui;


	//菜单层级
	int curTreeMenu2Val = 0;
	int curTreeMenu3Val = 0;
};

(4)其他相关逻辑,请自行实现文章来源地址https://www.toymoban.com/news/detail-487231.html

到了这里,关于QT使用QTreeWidget控件制作多级折叠菜单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QTreewidget右键菜单功能实现

    QTreewidget有一个信号继承自QWidget的信号void QWidget::customContextMenuRequested(const QPoint pos);我们来看看官方介绍: 简单翻译一下:当widget的 contextMenuPolicy即上下文菜单属性是 Qt::CustomContextMenu,并且用户已request widget上的上下文菜单时(也就是点了右键),会发出此信号。位置 pos 是wi

    2024年02月16日
    浏览(34)
  • el-menu使用递归组件实现多级菜单组件

    vue3+element plus版:点击此处 创建外层菜单 AsideMenu.vue 组件和子菜单项 AsideSubMenu.vue 组件,在 AsideSubMenu 中进行递归操作。 AsideMenu.vue文件内容如下: 判断高亮状态的activeMenu方法中的判断matchPath属性可以让多个路由不同的页面匹配同一个菜单高亮状态,因为菜单高亮状态是根据

    2023年04月12日
    浏览(45)
  • vue3使用el-menu多级菜单出现点击一个全部展开的问题

            测试时发现单击菜单显示子菜单时其它的菜单也被展开,看了其它文章写的是修改:index=\\\"menu.index\\\",         虽然点击菜单其它的子菜单不会展开了,但是index存的是编号,url存的是路由地址,点击子菜单地址栏显示的是编号信息,不是地址,如图所示      

    2024年02月02日
    浏览(50)
  • 举个栗子!Tableau 技巧(256):灵活折叠文本表的多级数据行

    通常,Tableau 默认的图表分层结构是统一打开或关上,有什么办法可以按需选择展开或折叠?如下示例:单击“+”展开层级,单击“-“收起层级。 可以试试集操作!今天的栗子,就来分享具体实现方法吧~ 本期《举个栗子》,我们要给大家分享的 Tableau 技巧是:灵活折叠文本

    2024年02月14日
    浏览(46)
  • Qt QTreeWidget 详解

    官方文档 QTreeWidget类是一个方便的类,它提供了一个标准tree小部件与一个典型的基于项目所使用的接口类似QListView Qt 3类。这个类是基于Qt的模型/视图的体系结构,使用一个默认的模型项目,每一个都是一个QTreeWidgetItem。 开发人员不需要模型/视图框架的灵活性可以使用这个类来

    2024年02月11日
    浏览(36)
  • 学习文档:QT QTreeWidget及其代理

    学习文档:QT QTreeWidget及其代理 1. QT QTreeWidget简介 QT QTreeWidget是QT框架中的一个重要组件,用于显示树形数据结构。它提供了一种方便的方式来展示并操作带有层次关系的数据。QTreeWidget可以显示包含多个列的树形视图,每个项目可以有多个子项目,从而创建一个多级树形结构

    2024年02月20日
    浏览(26)
  • 简易oled多级菜单实现

      最近在学习如何实现oled多级菜单时,查看了大多数博主发的文章,大概似懂的文章内容可让我好一阵思考,于是我觉得应该有一篇更加简单易懂的文章能轻易上手;我们实现项目时一定先要准备以下知识点:1. 结构体 2.结构体数组 3.函数指针 (如果还有没有这方面的C语言

    2024年02月05日
    浏览(67)
  • OLED多级菜单记录

    作为一个成熟的项目,就必然不会只有一个方面的特点了,这里一般我们可能需要系统来进行调度,然后给一些可视化的UI,当然我前面有讲到HMI串口屏的使用,串口屏确实是非常不错的UI工具,但是一些比较小的项目就用不太到了,因此这里如果是一些低成本的DIY的项目,一

    2024年02月02日
    浏览(43)
  • java实现多级菜单

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包