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

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;
};

源码下载

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

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

相关文章

【音视频基础概念】颜色与图像

文章目录 前言一、三原色不同三原色的概念三原色的作用 二、颜色空间颜色空间是什么颜色空间的作用常见颜色空间示例灰度图像是什么灰度图像的作用灰度图像的技术细节示例 总结 前言 在当今数字媒体时代&#xff0c;音视频技术在我们的日常生活中占据了重要位置。无论是观看电…

【Numpy】深入解析numpy.mat()函数

numpy.mat()&#xff1a;深入探索NumPy中的矩阵类 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简…

鸿蒙OS开发:【一次开发,多端部署】(导航栏) 导航栏

一多导航栏 介绍 本示例展示了导航组件在不同设备形态下的样式。 在sm设备上&#xff0c;以tabs形式展示&#xff0c;内容、导航为上下样式布局&#xff0c;通过点击底部tabs切换内容&#xff1b;在md/lg设备上&#xff0c;以[SideBarContainer]形式展示&#xff0c;内容、导…

爷爷看了都会,打工人必备的摸鱼AI神器!免费!

去年&#xff0c;AI技术无疑成为了最为引人注目的焦点&#xff0c;层出不穷的创新应用令人目不暇接。尽管许多人对这股AI热潮的持久性持怀疑态度&#xff0c;但现实却用事实给予了最有力的反驳。AI所展现出的强大生产力&#xff0c;足以令人刮目相看。 而今年以来&#xff0c;…

鸿蒙大厂目前政策变现沉淀思考

鸿蒙引擎定制优化 鸿蒙端hotfix&#xff1a; 技术栈太大了&#xff0c;但是鸿蒙需要学习什么呢&#xff1f; 什么最有价值&#xff1f; 这就是接下来需要表达下我的观点&#xff1a; 1、APP开发 2、应用市场技术专员 【游戏、电商重型APP性能的处理 SmartPerf、构建自己的工…

Marvelous Designer12 解锁版安装教程 (3D服装设计软件)

前言 Marvelous Designer允许您使用我们的尖端设计软件创建美丽的3D虚拟服装。最后&#xff0c;使用工具在提高质量的同时节省时间&#xff0c;为您的设计注入活力。从基本衬衫到复杂的褶皱连衣裙和粗糙的制服&#xff0c;Marvelous Designer几乎可以将织物纹理和物理特性复制…

Flink系列一:flink光速入门 (^_^)

引入 spark和flink的区别&#xff1a;在上一个spark专栏中我们了解了spark对数据的处理方式&#xff0c;在 Spark 生态体系中&#xff0c;对于批处理和流处理采用了不同的技术框架&#xff0c;批处理由 Spark-core,SparkSQL 实现&#xff0c;流处理由 Spark Streaming 实现&am…

Apache-Doris单机部署

参考&#xff1a; 快速体验 Apache Doris - Apache Doris 1、Apache Doris是一款 基于MPP架构的高性能、实时的分析型数据库&#xff0c;以高效、简单、统一的特点被人们所熟知&#xff0c;仅需 亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点…

内存泄漏面面谈

概述 主要介绍了内存泄漏的关注点是对象&#xff0c;对内存问题进行了分类并且确定本文关注点是内存泄漏&#xff0c;15种内存泄漏判断方式&#xff0c;hprof文件的用法和分析过程&#xff0c;以及memory profiler工具一些基本概念&#xff0c;最后提到了如何触发内存泄漏问题…

C# 读取 CSV 文件的方法汇总

文章目录 1. 使用System.IO命名空间中的类2. 处理标题行和指定列3. 使用CsvHelper库4. 高级功能和异常处理5. 使用 LINQ6. 总结 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff09;文件是一种简单的文本文件格式&#xff0c;用于存储表格数据。在C#中&a…

关于pdfbox读取pdf

最近&#xff0c;想着将pdf的文件进行读取其内容&#xff0c;发现了一个比较好用的依赖pdfbox。目前使用这个依赖&#xff0c;进行实现一个简单实例&#xff0c;如果之后需要使用到更深的了解&#xff0c;会进行更新。这里提醒一下&#xff1a;jdk8尽量采用pdfbox3.x版本。 对…

磁珠笔记汇总

磁珠笔记汇总 磁珠是和电感很相似的器件。 电感磁珠单位亨(H)欧姆(Ω)是否储能存储能量消耗高频能量应用场景通常用于开关电源吸收高频&#xff0c;EMC保护如何看待损耗使用电感时希望损耗越小越好使用磁珠时是利用其损耗来消耗不需要的高频分量 一、磁珠的工作原理 磁珠与…

代码随想录——左叶子之和(Leetcode404)

题目链接 BFS 队列 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

FreeRTOS_信号量_学习笔记

信号量的特性 消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递状态&#xff0c;这个状态值需要用一个数值表示。套用队列笔记中的流水线例子&#xff0c;可以理解为流水线上工件的数量。 信号&#xff1a;起通知作用 量&#xff1a;还可以用来表示资源的数量 当…

SNP数据转型解析:云服务在现代企业数字化转型的必要性

为什么当今的企业想为数字化工作环境做好准备并保持竞争力&#xff0c;很难避免使用云服务呢&#xff1f; 要理解为什么企业没有云的替代选择&#xff0c;我们需要了解云服务的含义 - 它不仅仅指存储数据的另一个位置。各种云模型提供了极大的灵活性&#xff0c;可以根据需要操…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…

Linux:IPC - System V

Linux&#xff1a;IPC - System V 共享内存 shm创建共享内存shmgetshmctlftok 挂接共享内存shmatshmdt shm特性 消息队列 msgmsggetmsgctlmsgsndmsgrcv 信号量 semSystem V 管理机制 System V IPC 是Linux系统中一种重要的进程间通信机制&#xff0c;它主要包括共享内存 shm&am…

[RK3588-Android12] 关于ES8388 喇叭+PDM回采 4+2配置

问题描述&#xff1a; ES8388 喇叭PDM回采 42配置如下&#xff1a; 解决方案&#xff1a; // MICpdmics: dummy-codec {status "okay";compatible "rockchip,dummy-codec";#sound-dai-cells <0>;};// MICpdm_mic_array: pdm-mic-array {status …

“一带一路”六国国际拳王冠军赛特克斯站新闻发布会顺利举行

实习记者&#xff1a;喀兰姆罕 5月24日&#xff0c;“一带一路”六国国际拳王冠军赛特克斯站新闻发布会在特克斯县阿克塔斯姑娘峰景区举行。这次拳王冠军赛事由新疆广播电视台、特克斯镇人民政府&#xff0c;特克斯县文化体育广播电视和旅游局主办&#xff0c;将于6月15日在特…

设计模式18—— 迭代器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 迭代器模式&#xff08;Iterat…