C++ Qt开发:Tab与Tree组件实现分页菜单

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍tabWidget选择夹组件与TreeWidget树形选择组件,的常用方法及灵活运用。

1.1 TabWidget

QTabWidget 是 Qt 中的一个用于显示多个页面的小部件,其中每个页面通常包含不同的内容。每个页面与一个标签相关联,用户可以通过点击标签来切换不同的页面。QTabWidget 是一个常见的用户界面元素,用于组织和展示具有层次结构的信息。

以下是关于 QTabWidget 的主要特点和用法:

主要特点

  1. 多页显示: QTabWidget 允许在同一窗口中显示多个页面,每个页面由一个标签页表示。
  2. 标签页: 每个页面都有一个与之相关联的标签,通常是一个文本标签或包含图标的标签,用于显示页面的名称或标识。
  3. 切换页面: 用户可以通过点击标签页来切换显示不同的页面,使得只有一个页面处于可见状态。
  4. 自定义标签页: QTabWidget 允许通过添加小部件(如按钮、文本框等)作为标签页,以定制标签页的外观和功能。

以下是 QTabWidget 类的一些常用方法的说明和概述,以表格形式列出:

方法描述
QTabWidget(QWidget *parent = nullptr)构造函数,创建一个 QTabWidget 对象。
addTab(QWidget *widget, const QString &label)QTabWidget 添加一个标签页,并关联一个小部件。
insertTab(int index, QWidget *widget, const QString &label)在指定位置插入一个标签页,并关联一个小部件。
removeTab(int index)移除指定位置的标签页。
clear()移除所有的标签页。
setCurrentIndex(int index)设置当前显示的标签页的索引。
currentIndex()获取当前显示的标签页的索引。
count()获取标签页的数量。
widget(int index)获取指定索引处的标签页关联的小部件。
tabText(int index)获取指定索引处的标签页的文本。
setTabText(int index, const QString &text)设置指定索引处的标签页的文本。
tabIcon(int index)获取指定索引处的标签页的图标。
setTabIcon(int index, const QIcon &icon)设置指定索引处的标签页的图标。
tabBar()返回 QTabBar 对象,允许对标签栏进行更高级的操作。
tabBar()->setTabButton(int index, QTabBar::ButtonPosition position, QWidget *widget)在指定位置添加一个小部件按钮到标签页。
setTabEnabled(int index, bool enable)启用或禁用指定索引处的标签页。
isTabEnabled(int index)检查指定索引处的标签页是否启用。
setTabToolTip(int index, const QString &tip)设置指定索引处的标签页的工具提示。
tabToolTip(int index)获取指定索引处的标签页的工具提示。
setTabWhatsThis(int index, const QString &text)设置指定索引处的标签页的 What’s This 文本。
tabWhatsThis(int index)获取指定索引处的标签页的 What’s This 文本。
currentChanged(int index)当前标签页发生变化时发出的信号,连接到槽函数以执行相应的操作。
tabCloseRequested(int index)用户请求关闭标签页时发出的信号,连接到槽函数以执行相应的操作。

这些方法提供了对 QTabWidget 进行标签页管理、属性设置以及与标签页交互的控制。你可以根据具体需求使用这些方法,定制 QTabWidget 的外观和行为。

与其他通用组件不同,TabWidget 组件只能通过在页面中添加,当需要增加新的子菜单时,可以通过右键组件选中插入页,在当前之后插入,这里我们分别增加四个子夹,此处只需要增加不需要重命名。

针对子夹的美化也很简单,只需要调用setTab系列函数即可,需要注意的是,调用这些函数其中第一个参数均为子选择夹的下标索引值,该索引值默认是从0开始计数的,完整代码如下所示;

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

    // 全局配置tabWidget选项卡
    ui->tabWidget->setTabPosition(QTabWidget::North);       // 设置选项卡方位
    ui->tabWidget->setIconSize(QSize(50, 25));              // 设置图标整体大小
    ui->tabWidget->setTabShape(QTabWidget::Triangular);     // 设置选项卡形状
    ui->tabWidget->setMovable(true);                        // 设置选项卡是否可拖动
    ui->tabWidget->usesScrollButtons();                     // 选项卡滚动

    // 设置选项卡1
    ui->tabWidget->setTabText(0,QString("进制转换标签"));           // 设置选项卡文本
    ui->tabWidget->setTabIcon(0,QIcon(":/image/about.ico"));      // 设置选项卡图标
    ui->tabWidget->setTabToolTip(0,QString("SpinBox 与进制转换"));  // 设置鼠标悬停提示

    // 设置选项卡2
    ui->tabWidget->setTabText(1,QString("颜色配置标签"));          // 设置选项卡文本
    ui->tabWidget->setTabIcon(1,QIcon(":/image/file.ico"));      // 设置选项卡图标
    ui->tabWidget->setTabToolTip(1,QString("滑块条的使用"));       // 设置鼠标悬停提示

    // 设置选项卡3
    ui->tabWidget->setTabText(2,QString("系统配置标签"));          // 设置选项卡文本
    ui->tabWidget->setTabIcon(2,QIcon(":/image/lock.ico"));      // 设置选项卡图标
    ui->tabWidget->setTabToolTip(2,QString("圆形组件与数码表"));    // 设置鼠标悬停提示

    // 设置选项卡4
    ui->tabWidget->setTabText(3,QString("文件配置标签"));          // 设置选项卡文本
    ui->tabWidget->setTabIcon(3,QIcon(":/image/lock.ico"));      // 设置选项卡图标
    ui->tabWidget->setTabToolTip(3,QString("文件配置组合"));       // 设置鼠标悬停提示
}

该组件常用于分页操作,以让应用程序可以在一个页面中容纳更多的子页面,如下图我们分别创建了四个选择夹,并实现了分页展示的效果;

1.2 TreeWidget

QTreeWidget 是 Qt 中的一个用于显示树形结构的小部件。它允许用户通过展开和折叠树节点来查看和管理层次化的数据。每个节点可以包含子节点,形成一个树状结构。QTreeWidget 继承自 QTreeWidget,提供了更高级的树状结构显示功能。

以下是关于 QTreeWidget 的主要特点和用法:

主要特点

  1. 树形结构: QTreeWidget 支持显示树形结构,每个节点可以包含子节点,形成一个层次化的树。
  2. 列显示: 可以在每个节点下显示多列数据,每列可以包含不同的信息,这使得 QTreeWidget 可以用于显示表格型数据。
  3. 编辑节点: 用户可以编辑节点的数据,允许动态修改树的内容。
  4. 选择和操作: 提供了丰富的选择和操作功能,用户可以通过键盘或鼠标进行节点的选择、展开和折叠等操作。
  5. 信号与槽: QTreeWidget 发送各种信号,如 itemClickeditemDoubleClicked 等,以便在用户与树交互时执行相应的操作。

以下是 QTreeWidget 类的一些常用方法的说明和概述,以表格形式列出:

方法描述
QTreeWidget(QWidget *parent = nullptr)构造函数,创建一个 QTreeWidget 对象。
addTopLevelItem(QTreeWidgetItem *item)向树中添加一个顶级项。
insertTopLevelItem(int index, QTreeWidgetItem *item)在指定位置插入一个顶级项。
takeTopLevelItem(int index)移除并返回指定位置的顶级项。
clear()移除所有的项。
topLevelItemCount()获取顶级项的数量。
topLevelItem(int index)获取指定位置的顶级项。
invisibleRootItem()获取树的不可见根项。
setCurrentItem(QTreeWidgetItem *item)设置当前项。
currentItem()获取当前项。
setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)在指定项和列上设置一个小部件。
itemWidget(QTreeWidgetItem *item, int column)获取指定项和列上的小部件。
editItem(QTreeWidgetItem *item, int column)编辑指定项和列的数据。
closePersistentEditor(QTreeWidgetItem *item, int column)关闭指定项和列上的持久编辑器。
collapseItem(QTreeWidgetItem *item)折叠指定项。
expandItem(QTreeWidgetItem *item)展开指定项。
isItemExpanded(QTreeWidgetItem *item)检查指定项是否展开。
setItemExpanded(QTreeWidgetItem *item, bool expand)设置指定项的展开状态。
scrollToItem(QTreeWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)滚动视图以确保指定项可见。
setItemHidden(QTreeWidgetItem *item, bool hide)设置指定项的隐藏状态。
isItemHidden(QTreeWidgetItem *item)检查指定项是否隐藏。
setItemDisabled(QTreeWidgetItem *item, bool disable)设置指定项的禁用状态。
isItemDisabled(QTreeWidgetItem *item)检查指定项是否禁用。
setItemSelected(QTreeWidgetItem *item, bool select)设置指定项的选择状态。
isItemSelected(QTreeWidgetItem *item)检查指定项是否被选择。
itemAt(const QPoint &p)返回在指定位置的项。
indexOfTopLevelItem(QTreeWidgetItem *item)获取指定顶级项的索引。
clearSelection()清除所有选定的项。
sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)根据指定列的数据对项进行排序。
headerItem()获取树的标题项。
setHeaderItem(QTreeWidgetItem *item)设置树的标题项。
header()获取树的标题。
setHeaderLabel(const QString &label)设置树的标题。
headerItem()获取树的标题项。
setHeaderItem(QTreeWidgetItem *item)设置树的标题项。
header()获取树的标题。
setHeaderLabel(const QString &label)设置树的标题。
setSortingEnabled(bool enable)启用或禁用树的排序功能。
isSortingEnabled()检查树的排序功能是否启用。
sortColumn()获取当前排序的列。
sortOrder()获取当前排序的顺序。
sortByColumn(int column, Qt::SortOrder order)根据指定列的数据对项进行排序。
currentChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)当前项发生变化时发出的信号,连接到槽函数以执行相应的操作。
itemClicked(QTreeWidgetItem *item, int column)项被点击时发出的信号,连接到槽函数以执行相应的操作。
itemDoubleClicked(QTreeWidgetItem *item, int column)项被双击时发出的信号,连接到槽函数以执行相应的操作。
itemPressed(QTreeWidgetItem *item, int column)项被按下时发出的信号,连接到槽函数以执行相应的操作。
itemActivated(QTreeWidgetItem *item, int column)项被激活时发出的信号,连接到槽函数以执行相应的操作。
itemCollapsed(QTreeWidgetItem *item)项被折叠时发出的信号,连接到槽函数以执行相应的操作。
itemExpanded(QTreeWidgetItem *item)项被展开时发出的信号,连接到槽函数以执行相应的操作。
itemChanged(QTreeWidgetItem *item, int column)项的数据发生变化时发出的信号,连接到槽函数以执行相应的操作。
itemSelectionChanged()选定项发生变化时发出的信号,连接到槽函数以执行相应的操作。

这些方法提供了对 QTreeWidget 进行树节点管理、属性设置以及与树节点交互的控制。你可以根据具体需求使用这些方法,定制 QTreeWidget 的外观和行为。

虽然TreeWidget组件可以实现多节点的增删改查功能,但在一般的应用场景中基本上只使用一层结构即可解决大部分开发需求,TreeWidget组件通常可配合TabWidget组件实现类似于树形菜单栏的功能,当用户点击菜单栏中的选项时则会跳转到不同的页面上。

首先在Qt的UI编辑界面左侧加入TreeWidget组件,右侧加入TabWidget组件,将页面中的TabWidget组件增加指定页,整体页面布局如下所示;

要实现对页面的美化只需要在代码中进行调整,在MainWindow::MainWindow主函数中我们对其中的两个组件进行初始化操作,并通过setText设置标签名,通过setIcon设置图标组,最后通过expandAll执行刷新到页面,其核心代码如下所示;

#include <iostream>
#include <QStyleFactory>

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

    ui->treeWidget->clear();
    ui->treeWidget->setColumnCount(1);
    ui->treeWidget->setHeaderHidden(true);

    // 隐藏tabWidget头部
    ui->tabWidget->tabBar()->hide();

    // 为treeWidget增加线条
    ui->treeWidget->setStyle(QStyleFactory::create("windows"));

    // ----------------------------------------------------------
    // 创建 [系统设置] 父节点
    // ----------------------------------------------------------
    QTreeWidgetItem *system_setup = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("系统位置")));
    system_setup->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
    system_setup->setIcon(0,QIcon(":/image/lock.ico"));

    // 给父节点添加子节点
    QTreeWidgetItem *system_setup_child_node_1 = new QTreeWidgetItem(system_setup);
    system_setup_child_node_1->setText(0,"修改密码");
    system_setup_child_node_1->setIcon(0,QIcon(":/image/about.ico"));

    QTreeWidgetItem *system_setup_child_node_2 = new QTreeWidgetItem(system_setup);
    system_setup_child_node_2->setText(0,"设置菜单");
    system_setup_child_node_2->setIcon(0,QIcon(":/image/about.ico"));

    // ----------------------------------------------------------
    // 创建 [页面布局] 父节点
    // ----------------------------------------------------------
    QTreeWidgetItem *page_layout = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("页面布局")));
    page_layout->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
    page_layout->setIcon(0,QIcon(":/image/lock.ico"));

    QTreeWidgetItem *page_layout_clild_1 = new QTreeWidgetItem(page_layout);
    page_layout_clild_1->setText(0,"页面配置");
    page_layout_clild_1->setIcon(0,QIcon(":/image/about.ico"));

    QTreeWidgetItem *page_layout_clild_2 = new QTreeWidgetItem(page_layout);
    page_layout_clild_2->setText(0,"页面参数");
    page_layout_clild_2->setIcon(0,QIcon(":/image/about.ico"));

    ui->treeWidget->expandAll();
}

当上述代码运行后我们可以得到一个经过美化后的页面,但我们还需要将TreeWidgetTabWidget组件的页码进行绑定,当用户点击TreeWidget组件时我们可以通过on_treeWidget_itemDoubleClicked槽函数获取到点击的页,通过在TreeWidget组件上右键并转到槽,找到itemDoubleClicked被点击事件,当页面被点击时则触发跳转,代码如下所示;

void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
    QString str = item->text(column);

     if(str == "修改密码")
     {
         ui->tabWidget->setCurrentIndex(0);
     }
     if(str == "设置菜单")
     {
         ui->tabWidget->setCurrentIndex(1);
     }
     if(str == "页面配置")
     {
         ui->tabWidget->setCurrentIndex(2);
     }
     if(str == "页面参数")
     {
         ui->tabWidget->setCurrentIndex(3);
     }
}

运行这个程序,读者可自行切换测试效果,当需要功能分页时只需要分别开发不同页面并放入到特定的TabWidget组中即可,如下图所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/250961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NE555汽车防盗报警电路图

实用汽车防盗报警电路如图所示。它主要由防盗部分和报警两大部分电路组成。防盗电路&#xff1a;当汽车主人离开汽车时&#xff0c;将防盗开关S置于“B”位置&#xff0c;使汽车进入防盗状态。当有窃贼进入驾驶室企图发动汽车将其盗走时&#xff0c;只要拧动点火开关&#xff0…

【Hive】【Hadoop】工作中常操作的笔记-随时添加

文章目录 1、Hive 复制一个表:2、字段级操作3、hdfs 文件统计 1、Hive 复制一个表: 直接Copy文件 create table new_table like table_name;hdfs dfs -get /apps/hive/warehouse/ods.db/table_nameload data local inpath /路径 into table new_table;修复表&#xff1a; m…

netty-daxin-4(httpwebsocket)

文章目录 http服务端NettyHttpServerHelloWorldServerHandler 客户端ApiPost http 服务端 NettyHttpServer 可参考&#xff1a;GitHub上netty项目中的example包中的代码 import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.net…

Linux——进程创建与进程终止

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程创建1、fork函数初识2、fork函数返回值3、写时拷贝4、fork常规用法5、fork调用失败的…

第15章 《乐趣》Page305~311, 代码精简以后,讨论一下引用含义的问题

将Page305~311的代码精简了一下&#xff0c;讨论一下引用含义的问题&#xff0c;精简之后的代码如下&#xff1a; #include <iostream> #include <SDL2/SDL.h>using namespace std;namespace sdl2 {char const* last_error() {return SDL_GetError(); }struct Ini…

盲盒小程序如何搭建?

随着移动互联网的发展&#xff0c;为了让消费者方便快捷地体验盲盒抽取乐趣&#xff0c;线上盲盒系统的开发成为了一个必要的过程。 今天本文将为大家介绍盲盒系统的搭建过程。 盲盒系统搭建过程 开发需求 在开发盲盒系统前&#xff0c;需要对盲盒市场深入分析&#xff0c;了…

Python+Requests+Pytest+YAML+Allure实现接口自动化

本项目实现接口自动化的技术选型&#xff1a;PythonRequestsPytestYAMLAllure &#xff0c;主要是针对之前开发的一个接口项目来进行学习&#xff0c;通过 PythonRequests 来发送和处理HTTP协议的请求接口&#xff0c;使用 Pytest 作为测试执行器&#xff0c;使用 YAML 来管理测…

Redis 数据类型和对象机制

一、Redis 简介 Redis 是&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;所有的 key 都是 String ,它的 value 可以是 String、hash、list、set、zset&#xff08;有序集合&#xff09;、Bitmaps&#xff08;位图&#xff09;、HyperLogLog、GEO(地理信息定位)…

【异步绘制】UIView刷新原理 与 异步绘制

快捷目录 壹、 iOS界面刷新机制贰、浅谈UIView的刷新与绘制概述一.UIView 与 CALayer1. UIView 与 CALayer的关系2. CALayer的一些常用属性contents属性contentGravity属性contentsScale属性maskToBounds属性contentsRect属性 二.View的布局与显示1.图像显示原理2.布局layoutSu…

IDEA中alt enter不显示创建实现类快捷键

alt enter不显示创建实现类快捷键是因为idea中的设置没打开&#xff0c;按照一下设置打开就可以了。 点击setting-->>editor-->>intentions-->>java下的declaration 如下图所示&#xff1a;

【第3期】Springboot集成SpringSecurity+RSA+ECS免密登录

本期简介 RSA是非常安全的非对称加解密算法&#xff0c;单纯的RSA的原理和使用网络资料较多&#xff0c;本期不细讲RSA的原理&#xff0c;主要讲解实战&#xff0c;如何与SpringbootSpringSecurity集成起来&#xff0c;做到在安全框架基础上&#xff0c;对用户的密码进行加密存…

centos离线安装mosquitto

1.x86_64架构centos7操作系统mosquitto包 本次真正要安装的机器是x86_64架构的AMD Ryzen 3 &#xff0c;操作系统是centos7 先找一台能联网的centos7机器 添加 EPEL 软件库 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm下载rpm包 …

Flink-水位线和时间语义

Flink中的时间含义 在实际应用中&#xff0c;事件时间语义会更为常见。一般情况下&#xff0c;业务日志数据中都会记录数据生成的时间戳&#xff08;timestamp&#xff09;&#xff0c;它就可以作为事件时间的判断基础。 在Flink中&#xff0c;由于处理时间比较简单&#xff0c…

开机0xc000000e修复方式,电脑出现错误代码0xc000000e

0xc000000e是Windows操作系统中的一个常见错误代码。错误代码0xc000000e表示操作系统无法找到正确的启动设备或引导记录损坏&#xff0c;导致电脑无法正常启动。今天的这篇文章将和大家分享一些关于开机0xc000000e修复的方法。 一.电脑出现开机0xc000000e的原因 开机出现0xc00…

证明四元数乘法与旋转矩阵乘法等价

刚体四元数姿态控制 一文中没有证明的公式 R ( Q 1 ) R ( Q 2 ) R ( Q 1 ∘ Q 2 ) R(Q_1)R(Q_2)R(Q_1\circ Q_2) R(Q1​)R(Q2​)R(Q1​∘Q2​) 在这篇文章中证明。 首先找几个数测试是否等价。 quaternions.py的代码见 自用的四元数、欧拉角、旋转矩阵转换代码。 下面的代码中…

Codeforces Round 915 (Div. 2)(A~C)

坐牢一个半小时...D、E待补(太菜了&#xff0c;做的题还是太少了&#xff09; A - Constructive 问题集 思路&#xff1a;手画一下发现&#xff1a;n个城市最多能重建n * n 的城市&#xff0c;所以n * m 需要重建max(n , m)个城市。 // Problem: A. Constructive Problems /…

使用netcore编写对比excel差异

一、新建项目Vlook项目 using MiniExcelLibs; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data; using System.IO;namespace Vlook {internal class Program{static void Main(string[] args){var dir App…

MQTT的奇妙之旅:探索RabbitMQ Web MQTT插件的威力【RabbitMQ 十一】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MQTT的奇妙之旅&#xff1a;探索RabbitMQ Web MQTT插件的威力 前言第一&#xff1a;揭秘RabbitMQ Web MQTT插件背景和目的&#xff1a;MQTT 协议简介&#xff1a;WebSockets 和 MQTT 的融合&#xff1…

selenium+xpath爬取二手房标题

贝壳找房标题爬取需要注意的是&#xff0c;在页面中间有一个小广告 而他就在ul的li下面&#xff0c;当我们进行title所以输出时&#xff0c;会报错。 所以在进行页面解析之前必须把广告叉掉&#xff0c;不然也把广告那一部分的li给爬取下来了 所以&#xff0c;我们&#xff0…

【音视频 | H.264】H.264视频编码及NALU详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…