《QT实用小工具·六十七》QTabWidget实现的炫酷标签工具栏

news2025/1/12 4:47:01

1、概述
源码放在文章末尾

该项目基于QTabWidget和QTabBar实现了灵活的标签工具栏,主要包含如下功能:
1、标签栏可以收起,可以展开
2、可以在标签栏中添加新的标签界面
3、可以从标签工具栏中把界面拖出来,也可以拖回去
4、关闭拖出来的界面会自动回到标签工具栏
5、可以调换标签工具栏中界面的顺序

项目demo演示如下所示:
在这里插入图片描述
使用方式:
1、创建标签栏对象

TabBarPlugin* tabBarPlugin = new TabBar();

2、把标签栏放入布局

ui.centralWidget->layout()->addWidget(tabBarPlugin->getWidget());

3、在标签栏中添加多个界面

tabBarPlugin->addWidget(widget1, "testDemo1", QIcon());
tabBarPlugin->addWidget(widget2, "testDemo2", QIcon());
tabBarPlugin->addWidget(widget3, "testDemo3", QIcon());

项目部分代码如下所示:

#pragma once

#include <QTabWidget>
//#include "ui_CustomTabWidget.h"
#include "CustomTabBar.h"

/**
 * @brief 自定义TabWidget
 * @details setTabBar为protected接口,要修改tabbar就得继承下
 *  如果标签页关闭后会释放
 *  因此只需要删除tab不关闭窗口时需要调用 remove,clear
 *  因此需要删除tab同时关闭窗口时需要调用 close
 * 
 *  保存弹出的widget指针,因为弹出的窗口有时候不会关闭,可能会导致重复添加
 *  在窗口弹出的时候添加到m_QLPopedPage,在窗口恢复以及关闭的时候从m_QLPopedPage移除
 *  当删除标签页的时候,判断是否为弹出的,弹出的不删除
 *  当添加标签页的时候,判断是否为弹出的,弹出的不添加
 *
 *  If the tab is closed, it will be released
 *  You only need to delete the tab without closing the window. You need to call remove, clear
 *  When you need to delete the tab and close the window, you need to call close
 *
 *  Save the pop-up widget pointer, because the pop-up window will not be closed sometimes, which may lead to repeated addition
 *  Add to m_QLPopedPage when the window pops up, and remove from m_QLPopedPage when the window restores and closes
 *  When deleting a tab, judge whether it is pop-up, and the pop-up will not be deleted
 *  When adding a tab, judge whether it is pop-up, and do not add the pop-up
 * 
 */

class CustomTabWidget : public QTabWidget
{
	Q_OBJECT

public:
	CustomTabWidget(QWidget *parent = nullptr);
	~CustomTabWidget();

public:
    // add a page  
    int addTab(QWidget* page);
    int addTab(QWidget* page, const QString&);
    int addTab(QWidget* page, const QIcon& icon, const QString& windowTitle);

    //Add a page that cannot be closed and dragged out
    //appendNormalPage+setFixedPage
    void addFixedTab(QWidget* page);
    //void addFixedTab(QWidget* page, const QString&);

    //Set that a page cannot be closed and dragged out
    void setFixedTabPage(QWidget* page);
    void setFixedTabPage(int index);

    // Remove a page and do not close it
    void removeTab(QWidget* page);
    void removeTab(int index);

    // Remove current page
    void removeCurrentTab();

    //Clear all pages (no include fixed pages), only the tabs on the tabbar will be cleared, and the pop-up will not be cleared
    void clearTab();

    //Clear all pages (include fixed pages), only the tabs on the tabbar will be cleared, and the pop-up will not be cleared
    void clearAllTab();

    // tab is valid
    bool isTabPageValid(int index) const;
    bool isTabPageValid(QWidget* page) const;

    // Check whether a page has popped up
    //bool isTabPagePoped(int index) const;
    bool isTabPagePoped(QWidget* page) const;

    // Move a page from the tab and record the widget pointer to the pop-up list
    void popTab(QWidget* page);
    // Pop up a page and create a new window to place the widget
    void popPage(QWidget* page);

    // Set whether the label can be closed, and connect the signal and slot when it can be closed
    void setTabsClosable(bool flag);

signals:
    void updateTabWidgetPage(QTabWidget*);

private slots:
    void isDialogIntoTabBar(QPoint point, QDialog* dialog);

protected:
    void showEvent(QShowEvent* event);
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
private:
    CustomTabBar* m_pBar = nullptr;
    void initTabBar();

private:
	//Ui::CustomTabWidgetClass ui;

     // Save tab pages that cannot be dragged out (such as home page)
    QList<QWidget*> m_QLfixedPage;
    // Save the dragged tab
    QList<QWidget*> m_QLPopedPage;
};

源码下载

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

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

相关文章

详解Java ThreadLocal

个人博客 详解Java ThreadLocal | iwts’s blog Java ThreadLocal ThreadLocal提供了线程内存储变量的能力&#xff0c;这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。 TreadLocal存储模型 ThreadLocal的静态…

vue3通过ElementPlus的tooltip组件实现自定义指令文字提示

vue3自定义指令实现tooltip文字提示&#xff0c;通过ElementPlus的tooltip组件 简介步骤1&#xff1a;定义指令tooltip步骤2&#xff1a;createTooltip函数步骤3&#xff1a;autoShowToolTip步骤4&#xff1a;注册指令步骤5&#xff1a;测试 简介 之前的项目中&#xff0c;有些…

基于springboot实现华府便利店信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现华府便利店信息管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本华府便利店信息管理系统就是在这样的大环境下诞生&#xff…

NXP i.MX8系列平台开发讲解 - 3.13 Linux 之Audio子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 目录 1. Linux ALSA 内核框架 2. Linux ALSA 代码分析 2.1 声卡驱动初始化 2.2 声卡创建注册 2.3 PCM设备创建 3. ALSA ASoC 3.1 Machine 3.2 Platform 3.3 Codec 上一章节&#xff0c;对于Linux Audio子系统有了大概的了解…

做视频号小店遇到差评怎么处理?如何规避差

大家好&#xff0c;我是喷火龙。 大家在做店的时候应该都会遇到品退、中差评这些问题&#xff0c;这对我们的店铺影响还是非常大的&#xff0c;差评过多就会影响店铺的体验分&#xff0c;从而影响店铺的流量&#xff0c;还会间接的影响商品的转化率&#xff0c;如果太低的话&a…

@RequestBody注解

文章目录 RequestBody注解基本概念在postman里如何发送接收端带有RequestBody的请求&#xff1f; RequestBody注解 基本概念 扩展&#xff1a; http报文会包含四部分&#xff0c;第一部分是请求行&#xff0c;第二部分是请求头&#xff0c;第三部分是空行&#xff0c;第四部分…

示教编程操作QA

示教器的连接问题 Q1&#xff1a;示教器显示连接断开&#xff0c;该如何解决&#xff1f; A1&#xff1a;原因&#xff1a;示教器与控制器之间断开连接&#xff0c;需要调整控制器来解决该问题。解决方法1&#xff1a;重启控制器&#xff1b;解决方法2&#xff1a;将控制器与P…

Python: 使用pyotp实现OTP一次性密码验证

使用pyotp实现OTP一次性密码验证 OTP的基本原理 生成一个共享秘钥作为随机数的种子服务端通过种子计算出当前的密码客户端也通过相同的种子计算出当前的密码验证客户端生成的密码和服务端生成的密码是否匹配 服务端和客户端计算的方式一样 共享密钥 时间因子 算法 > 密…

XDebug配置几件教程,phpstorm实现http请求断点调试

写这篇的文章的初衷:网络上配置XDebug的文章有很多,XDebug也有官方的文档, PhpStorm也有官方的文档,为什么还要写那? 相信不少人,都有一种感觉,虽然教程很多,但是按教程走一遍,自己的确不能正常调试。 问题出在下面几个方面: 1. 对调试过程中,没有一定的认识,因此…

100个 Unity小游戏系列五 -Unity 抽奖游戏专题三老虎机游戏

一、演示效果 二、知识点讲解 2.1 布局 public void CreateItems(SlotsData[] slotsData){isInited false;slotsPrizeList new List<SlotsData>();for (int i 0; i < slotsData.Length; i){var item slotsData[i];slotsPrizeList.Add(item);}float bottomY -it…

探索Python的包与模块:构建项目的基石

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、模块与包的基础认知 1. 模块的定义与创建 2. 包的组织与管理 二、模块与包的进阶使用…

【分支控制(if-else判断)】单分支-双分支-多分支-嵌套分支

程序流程控制 在程序中, 程序运行的流程控制决定程序是如何执行的, 是我们必须掌握的, 主要有三大流程控制语句. 顺序控制 (简单)分支控制 (判断)循环控制 (循环) 一. 顺序控制 顺序控制介绍 程序从上到下逐行地执行, 中间没有任何判断和跳转. 顺序控制举例和注意事项 Java中…

AUS GLOBAL 与 UNICEF 联合国儿童基金会共同帮助叙利亚和土耳其地震受灾居民

2023年2月6日,土耳其东南部和叙利亚发生两次强烈地震和数十次余震,数以千计的儿童和家庭面临危机。 成千上万的房屋被毁,许多家庭被迫流离失所,而在一年中的这个时候,气温经常低于冰点,雪和冻雨很常见。许多学校、医院以及其他医疗和教育设施被地震破坏或摧毁,这对儿童造成了巨…

马斯克开启军备竞赛,xAI筹集60亿美元

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

蓝桥杯—SysTick中断精准定时实现闪烁灯

在嵌入式系统中&#xff0c;SysTick_Handler 是一个中断服务例程&#xff08;Interrupt Service Routine, ISR&#xff09;&#xff0c;用于处理 SysTick 定时器的中断。SysTick 定时器通常用于提供一个周期性的定时中断&#xff0c;可以用来实现延时或者周期性任务。 SysTick…

AWS联网和内容分发之Transit Gateway

将Amazon VPC、AWS账户和本地网络连接到一个网关中。AWS Transit Gateway通过中央枢纽连接Amazon虚拟私有云&#xff08;VPC&#xff09;和本地网络。此连接简化了您的网络&#xff0c;并且结束了复杂的对等关系。Transit Gateway充当高度可扩展的云路由器&#xff0c;每个新的…

HLS入门(Xilinx Vivado 2019.2)——点亮LED仿真

HLS入门——点亮LED仿真 一、HLS简介&#xff08;一&#xff09;什么是HLS&#xff1f;&#xff08;二&#xff09;HLS能做什么&#xff1f;&#xff08;三&#xff09;HLS的使用&#xff08;四&#xff09;HLS的优势&#xff08;五&#xff09;HLS与VHDL/Verilog编程技术的关系…

【机器学习】【深度学习】正则化(Regularization)

概念 正则化&#xff08;Regularization&#xff09;是在机器学习模型中避免过拟合的一种技术。它通过引入一个惩罚项&#xff08;即正则项&#xff09;来限制模型的复杂度&#xff0c;以此来提防模型过度依赖训练数据&#xff0c;捕获数据中的噪音信息而导致过拟合现象。简单…

企业营收分析难?搞定收入认领月底不加班!

在当今日益激烈的市场竞争中&#xff0c;企业的营收分析不仅是衡量经营成果的关键指标&#xff0c;更是指导企业未来发展的重要依据。然而&#xff0c;对于许多企业来说&#xff0c;营收分析的过程往往繁琐且耗时&#xff0c;尤其是月底结账时&#xff0c;大量的数据和复杂的计…

【机器学习300问】95、什么是KNN算法?它和K-means什么关系?

一、KNN算法的定义 KNN&#xff08;K-Nearest Neighbors&#xff09;算法&#xff0c;是一种简单而有效的监督学习方法。它既可以用在分类任务&#xff0c;也可用在回归任务中。KNN算法的核心思想&#xff1a;在特征空间中&#xff0c;如果有一个数据点周围的大多数邻居属于某个…