【Qt笔记】QToolBox控件详解

news2024/9/21 0:29:15

目录

引言 

一、QToolBox的基本功能

1.1 分页布局

1.2 可点击标签

1.3 图标支持

1.4 信号与槽

二、 QToolBox的属性设置

2.1 设置指定索引位置可用性

2.2 设置指定索引位置图标

2.3 设置标题

2.4 设置提示信息

2.5 获取信息 

三、QToolBox的常用API

3.1 构造函数 

3.2 添加页面

3.2.1 尾部添加 

3.2.2 指定位置添加 

3.3 移除页面

四、应用示例 

4.1 代码 

4.2 实现效果 

4.3 解析

结语


引言 

QToolBox是Qt框架中一个非常实用的容器控件,它提供了一种类似于标签页(Tab Widget)但布局更加紧凑的界面组织方式。QToolBox通过一系列的可点击选项卡来展示不同的内容或工具,每个选项卡可以关联一个QWidget实例,使得用户可以通过点击选项卡来切换显示不同的界面或功能。以下是对QToolBox控件的详细解析,包括其功能、属性设置、相关API、信号与槽机制,以及代码示例。 

一、QToolBox的基本功能

1.1 分页布局

分页布局:QToolBox以标签页的形式展示多个页面,每个页面可以放置任何QWidget。

// 创建QToolBox  
QToolBox toolBox;  
  
// 创建并添加第一个页面  
QWidget *page1 = new QWidget();  
QLabel *label1 = new QLabel("这是第一个页面", page1);  
QVBoxLayout *layout1 = new QVBoxLayout(page1);  
layout1->addWidget(label1);  
toolBox.addItem(page1, "页面 1");  
  
// 创建并添加第二个页面  
QWidget *page2 = new QWidget();  
QLabel *label2 = new QLabel("这是第二个页面", page2);  
QVBoxLayout *layout2 = new QVBoxLayout(page2);  
layout2->addWidget(label2);  
toolBox.addItem(page2, "页面 2");  
  
// 设置窗口和布局  
toolBox.setWindowTitle("QToolBox 分页布局示例");  
toolBox.show(); 

1.2 可点击标签

可点击标签:顶部的标签可以点击,用来切换显示不同的页面内容。

顶部的标签是可点击的,用来切换显示不同的页面内容。上面的示例已经展示了这一点,因为当你点击任何一个标签时,相应的页面就会显示出来。

1.3 图标支持

图标支持:每个页面可以设置图标和文本,增强视觉提示。

// 创建QToolBox  
QToolBox toolBox;  
  
// 创建并添加第一个页面,包含图标  
QWidget *page1 = new QWidget();  
QLabel *label1 = new QLabel("带有图标的页面 1", page1);  
QVBoxLayout *layout1 = new QVBoxLayout(page1);  
layout1->addWidget(label1);  
QIcon icon1(":/path/to/icon1.png"); // 确保图标路径正确  
toolBox.addItem(page1, icon1, "页面 1");  
  
// 创建并添加第二个页面  
QWidget *page2 = new QWidget();  
QLabel *label2 = new QLabel("页面 2", page2);  
QVBoxLayout *layout2 = new QVBoxLayout(page2);  
layout2->addWidget(label2);  
toolBox.addItem(page2, "页面 2");  
  
// 设置窗口和布局  
toolBox.setWindowTitle("QToolBox 图标支持示例");  
toolBox.show();

注意::/path/to/icon1.png是资源文件的路径,你需要将图标添加到Qt资源文件中,并使用相应的路径。 

1.4 信号与槽

信号与槽:提供了页面改变的信号,便于响应用户操作。

#include <QApplication>  
#include <QToolBox>  
#include <QLabel>  
#include <QVBoxLayout>  
#include <QDebug>  
  
class MyToolBox : public QToolBox {  
    Q_OBJECT  
public:  
    MyToolBox(QWidget *parent = nullptr) : QToolBox(parent) {  
        // 初始化代码(如果有的话)  
        connect(this, &QToolBox::currentChanged, this, &MyToolBox::onCurrentChanged);  
    }  
  
private slots:  
    void onCurrentChanged(int index) {  
        qDebug() << "当前页面索引已改变:" << index;  
    }  
};  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    // 使用自定义的MyToolBox  
    MyToolBox toolBox;  
  
    // 添加页面...(同上)  
  
    // 设置窗口和布局  
    toolBox.setWindowTitle("QToolBox 信号与槽示例");  
    toolBox.show();  
  
    return app.exec();  
}

二、 QToolBox的属性设置

2.1 设置指定索引位置可用性

setItemEnabled:设置指定索引位置的选项卡是否可用。 

void QToolBox::setItemEnabled(int index, bool enabled);
  • index:选项卡索引。
  • enabled:启用或禁用标志。

2.2 设置指定索引位置图标

setItemIcon:设置指定索引位置的选项卡的图标。 

void QToolBox::setItemIcon(int index, const QIcon &icon);
  • index:选项卡索引。
  • icon:要设置的图标。

2.3 设置标题

setItemText:设置指定索引位置的选项卡的标题。 

void QToolBox::setItemText(int index, const QString &text);
  • index:选项卡索引。
  • text:要设置的标题文本。

2.4 设置提示信息

setItemToolTip:设置指定索引位置的选项卡的提示信息。 

void QToolBox::setItemToolTip(int index, const QString &toolTip);
  • index:选项卡索引。
  • toolTip:要设置的提示信息。

2.5 获取信息 

itemIconitemTextitemToolTip:分别用于获取指定索引位置的选项卡的图标、标题和提示信息。

三、QToolBox的常用API

3.1 构造函数 

QToolBox::QToolBox(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
  • parent:父窗口指针,可选。
  • f:窗口标志,可选。

3.2 添加页面

3.2.1 尾部添加 

addItem:在工具箱尾部添加一个选项卡(页面)。

int QToolBox::addItem(QWidget *widget, const QString &text);  
int QToolBox::addItem(QWidget *widget, const QIcon &icon, const QString &text);
  • widget:添加到工具箱中的子窗口对象。
  • icon:工具箱新的选项卡上显示的图标,可选。
  • text:工具箱新的选项卡上显示的标题。
3.2.2 指定位置添加 

 insertItem:在工具箱的指定位置插入一个选项卡(页面)。

int QToolBox::insertItem(int index, QWidget *widget, const QString &text);  
int QToolBox::insertItem(int index, QWidget *widget, const QIcon &icon, const QString &text);
  • index:指定在工具箱中插入的新选项卡的位置。

3.3 移除页面

removeItem:从工具箱中移除指定位置的选项卡(页面)。

void QToolBox::removeItem(int index);
  • index:要移除的选项卡索引。

四、应用示例 

QToolBox控件在 Qt 中是一个相当灵活的组件,用于以标签页的形式组织多个界面元素。虽然其基本用法相对简单,但通过一些高级应用,你可以使 QToolBox更加丰富和动态。以下是一个 QToolBox控件的高级应用示例,包括动态添加和删除页面、使用自定义小部件以及处理页面变化时的逻辑。

4.1 代码 

#include <QApplication>  
#include <QToolBox>  
#include <QWidget>  
#include <QVBoxLayout>  
#include <QPushButton>  
#include <QLabel>  
#include <QHBoxLayout>  
#include <QLineEdit>  
#include <QMessageBox>  
  
class DynamicToolBox : public QToolBox {  
    Q_OBJECT  
  
public:  
    DynamicToolBox(QWidget *parent = nullptr) : QToolBox(parent) {  
        // 初始化UI  
        setupUi();  
        // 连接信号  
        connect(addButton, &QPushButton::clicked, this, &DynamicToolBox::addPage);  
        connect(removeButton, &QPushButton::clicked, this, &DynamicToolBox::removeCurrentPage);  
    }  
  
private slots:  
    void addPage() {  
        // 创建一个新的页面  
        QWidget *page = new QWidget();  
        QLabel *label = new QLabel(tr("新页面 %1").arg(count() + 1), page);  
        QLineEdit *lineEdit = new QLineEdit(page);  
        QHBoxLayout *layout = new QHBoxLayout(page);  
        layout->addWidget(label);  
        layout->addWidget(lineEdit);  
  
        // 添加页面到QToolBox,并设置标题  
        addItem(page, tr("页面 %1").arg(count() + 1));  
  
        // 可选:存储对页面的引用,以便后续操作  
        // 例如:将 page 指针存储到某个容器中  
    }  
  
    void removeCurrentPage() {  
        // 检查是否有页面可以移除  
        if (count() > 0) {  
            // 移除当前选中的页面  
            removeItem(currentIndex());  
        } else {  
            QMessageBox::warning(this, tr("警告"), tr("没有页面可以移除!"));  
        }  
    }  
  
private:  
    QPushButton *addButton;  
    QPushButton *removeButton;  
  
    void setupUi() {  
        // 创建一个布局用于放置按钮  
        QVBoxLayout *layout = new QVBoxLayout(this);  
  
        // 添加“添加页面”按钮  
        addButton = new QPushButton(tr("添加页面"), this);  
        layout->addWidget(addButton);  
  
        // 添加“移除页面”按钮  
        removeButton = new QPushButton(tr("移除页面"), this);  
        layout->addWidget(removeButton);  
  
        // 注意:我们不需要在这里添加QToolBox的页面,因为它们将通过按钮操作动态添加  
    }  
};  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
  
    DynamicToolBox toolBox;  
    toolBox.setWindowTitle(tr("QToolBox 高级应用示例"));  
    toolBox.show();  
  
    return app.exec();  
}  

4.2 实现效果 

 

4.3 解析

  1. 类定义:DynamicToolBox 类继承自 QToolBox,并添加了两个私有槽 addPage 和 removeCurrentPage 用于处理页面添加和删除。

  2. UI 设置:在 setupUi 方法中,我们为 DynamicToolBox 添加了两个按钮(添加和删除),并将它们放置在一个垂直布局中。注意,我们没有在这里添加任何页面到 QToolBox,因为页面将通过按钮操作动态生成。

  3. 添加页面:当用户点击“添加页面”按钮时,addPage 槽函数被调用。该函数创建一个新的 QWidget,为其添加一些子控件(如 QLabel 和 QLineEdit),并使用 addItem 方法将其作为新页面添加到 QToolBox 中。页面标题是动态生成的,基于当前的页面数量。

  4. 移除页面:当用户点击“移除页面”按钮时,removeCurrentPage 槽函数被调用。该函数首先检查是否有页面可以移除(即 count() > 0),然后使用 removeItem 方法移除当前选中的页面。

  5. 信号与槽:通过 connect 函数,我们将按钮的 clicked 信号连接到相应的槽函数上,以便在用户交互时执行相应的操作。

  6. 注意:在上面的代码中,我们没有存储对动态创建页面的引用。如果你需要在后续操作中访问这些页面(例如,更新页面内容或检索用户输入),你可能需要将页面指针存储到某个容器(如 QList<QWidget*>)中。然而,在这个简单的示例中,我们专注于展示如何动态地添加和移除页面。

结语

QToolBox是Qt中一个非常实用的容器控件,它通过分页布局和可点击的标签提供了一种高效、用户友好的界面组织方式。通过本文的详细解析和代码示例,希望能帮助读者更好地理解和运用QToolBox控件,在Qt项目中创建出更加高效和用户友好的界面布局。 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端vue-单选按钮的实现

要把name“sex”和value"男" 和 要把name“sex”和value"女"写上&#xff0c;然后在各自的标签内部写上v-model绑定属性。data中定义v-model的绑定值&#xff0c;后面的值是默认选中的男或者女性。

Google Play金融类应用上了又被下,怎么搞定设备短信权限问题?

不久前谷歌对金融类产品应用更新了政策要求&#xff0c;即8月31日起新注册的开发者账号必须得注册为企业账号才可以上架金融类产品应用&#xff0c;这对原本就是用企业号的开发团队或公司没什么影响&#xff0c;但如果用的是个人号得做点准备了。 可以看出&#xff0c;谷歌对金…

剑灵服务端源码(c#版本+数据库+配套客户端+服务端)

剑灵服务端源码&#xff0c;喜欢的下载研究研究。谁技术牛B的话&#xff0c;能把最新版本的客户端接上&#xff0c;就好了。 剑灵服务端源码&#xff08;c#版本数据库配套客户端服务端&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】剑灵服务端源码…

利士策分享,自我和解:通往赚钱与内心富足的和谐之道

利士策分享&#xff0c;自我和解&#xff1a;通往赚钱与内心富足的和谐之道 在这个快节奏、高压力的时代&#xff0c;我们往往在追求物质财富的同时&#xff0c;忽略了内心世界的和谐与平衡。 赚钱&#xff0c;作为现代生活中不可或缺的一部分&#xff0c;它不仅仅是生存的手段…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…

C++第十一节课 new和delete

一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数&#xff08;new会自动调用构造函数&#xff1b;delete会调用析构函数&#xff09; class A { public:A(int a 0): _a(a){cout <&l…

systemd学习

传统init进程启动流程 kernel内核代码init/main.c&#xff0c;内核启动init进程过程&#xff1a; init进程是由内核启动的第一个&#xff08;也是唯一的一个&#xff09;用户进程&#xff08;进程id为1&#xff09;&#xff0c;它根据配置文件决定启动哪些程序&#xff0c;ini…

mybatisplus的多记录操作 批量删除和批量查询

1.批量查询 通过in查询 Testpublic void testBatchSelectByIds(){List<Integer> ids Arrays.asList(5,7);List<User> users userMapper.selectBatchIds(ids);log.info(users);} 2.批量删除 Testpublic void testBatchDelete(){List<Integer> ids Arrays…

LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142237871 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用&#xff08;SoftReference&#xff09;弱引用&#xff08;WeakReference&#xff09;考一考 虚引用&#xff08;PhantomReference&#xff09;总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定&#xff0c;主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block&#xff08;块&#xff09;&#xff1a;独立的功能性页面组件&#xff0c;可以是一个简单的按钮&#xff0c;一个复杂的导航条&…

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

功耗中30分钟下载场景对平均电流标准的影响评估

下载场景的测试数据: 测试结论:相同场景下,有应用下载安装跟没应用下载安装,平均电流相差90-140mA左右 查看数据:下载场景的平均增量电流 (227+279) / 2 - 136 = 117 mA 理论的量化数据影响 根据当前的测试数据:静置待机平均电流 136 mA,下载场景平均电流增量 117mA, …

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

电气自动化入门05:三相异步电动机的正反转点动控制电路

视频链接&#xff1a;3.2 电工知识&#xff1a;三相异步电动机的正反转点动控制电路_1_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.断路器及其选型 1.1断路器定义、分类、表示符号 1.2.断路器功能、…

Vision Transform—用于大规模图像分类的Transformers架构

VIT — 用于大规模图像识别的 Transformer 论文题目&#xff1a;AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码&#xff1a;https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer&#xff08;ViT&…

虚拟机vaware中cpu设置跑满大核

首先&#xff0c;大核速度快&#xff0c;并且在资源紧张时大核优先&#xff0c;小核甚至是闲着围观大核跑满。其次&#xff0c;遇到经常切换操作虚拟机和win11的使用场景&#xff0c;切换核心本身也会造成一点卡顿&#xff0c;降低虚拟机里操作流畅度。另外&#xff0c;13代在你…

【linux】4张卡,坏了1张,怎么办?

先禁用这张卡 grub 禁用&#xff0c;防止加载驱动 禁用这张卡的 PCI # 禁用 PCI 设备 0000:b1:00.0 (NVIDIA GPU) ACTION"add", SUBSYSTEM"pci", ATTR{vendor}"0x10de", KERNELS"0000:b1:00.0", RUN"/bin/sh -c echo 0000:b1:00…

vue part 10

vue-resource 在vue1.0时代讲的比较多&#xff0c;是vue.插件库&#xff0c; import vueResource from vue-resourceVue.use(vueResource) 在vc和vm中会多出如下F12代码即&#xff0c;$http:() 他的用法和返回值和axios一模一样&#xff0c;但是不常维护了 插槽 默认插槽 …