qt5-入门-标签页部件QTabWidget-2-新增和删除标签页

参考:
C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt5.12


上一篇:

qt5-入门-标签页部件QTabWidget-1-CSDN博客
https://blog.csdn.net/pxy7896/article/details/136883359

目录

  • 效果
  • 实现
    • 添加标签页的按钮
    • 添加右键菜单
    • 槽函数

效果

  • 在首页右侧有一个➕按钮,点击后可以动态添加新的标签页
  • 在标签页头部右键,可以选择删除当前页或除了当前页外其他所有的标签页。
    在这里插入图片描述

实现

与上一篇一样,对象的结构如下图所示:(只是删掉了名为tab的第二个标签页)
在这里插入图片描述
首先修改头文件,增加一个重载函数、两个私有槽函数和一个私有变量。(比较好理解,不作解释)

protected:void contextMenuEvent(QContextMenuEvent* event) override;private slots:void on_actionDelCurTab_triggered();void on_actionDelOtherTabs_triggered();private:int newTabNum; // 用于记录新建的标签页数量,需要在构造函数里初始化。也可以声明成静态变量

使用变量记录标签页数量是为了避免因删除导致使用this->count()命名新标签页出错的bug。

然后实现这些函数。

添加标签页的按钮

这段代码放在ui->setupUi(this)后。

QPushButton *addTabBtn = new QPushButton;
addTabBtn->setIcon(QIcon("://resources/icon/add.png"));
// 如果需要调整尺寸,可以考虑
//addTabBtn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
addTabBtn->setToolTip(tr("添加新标签页"));
addTabBtn->setStyleSheet("QPushButton {""    background-color: transparent;"    // 设置背景色为红色"    border: none;"              // 去掉边框"    margin: 0px 10px 0px 0;" // 边距,上右下左"}""QPushButton:hover {""    background-color: #268BD2;"    // 鼠标悬停时的背景色"}""QPushButton:pressed {""    background-color: #21618C;"    // 按下按钮时的背景色"}");int tabCount = this->count();
// 新增tab的效果
connect(addTabBtn, &QPushButton::clicked, [this]() {QWidget *newTab = new QWidget();newTabNum ++;this->addTab(newTab, tr("新标签页") + QString::number(newTabNum));
});
this->setCornerWidget(addTabBtn, Qt::TopRightCorner); // 放在最右侧

需要注意的是,如果通过stylesheet来形成无边框的QPushButton,可能导致丢失hover和pressed效果。比如如果使用下面的代码:

addTabBtn->setStyleSheet("border:none;");
// 或者
addTabBtn->setStyleSheet("background-color:transparent;");

都可以实现无边框按钮的效果,但是hover和pressed都不能使按钮变色。如果想保留效果,还是要用上面的代码。

添加右键菜单

void MainTabWidget::contextMenuEvent(QContextMenuEvent* event){QMenu menu(this);QAction *actionDelCurTab = menu.addAction(tr("删除当前页"));connect(actionDelCurTab, &QAction::triggered, this, &MainTabWidget::on_actionDelCurTab_triggered);QAction *actionDelOtherTabs = menu.addAction(tr("删除其他页"));connect(actionDelOtherTabs, &QAction::triggered, this, &MainTabWidget::on_actionDelOtherTabs_triggered);QPoint pos = event->pos();int tabIndex = tabBar()->tabAt(pos);// 如果选项卡索引等于当前选中索引if (tabIndex == currentIndex()) {menu.exec(event->globalPos());}
}

槽函数

void MainTabWidget::on_actionDelCurTab_triggered() {int curIndex = this->currentIndex();// 也可以判断curIndex != 0if (this->currentWidget() != ui->homeWidget) {removeTab(curIndex);}
}void MainTabWidget::on_actionDelOtherTabs_triggered() {int curIndex = this->currentIndex();int cnt = this->count();// home不能删除for (int i = cnt - 1; i > 0; i--) {if (i != curIndex) {removeTab(i);}}
}

done.

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

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

相关文章

机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】

目录 前言 一、什么是线性回归 二、什么是逻辑回归 三、基于Python 和 Scikit-learn 库实现线性回归 示例代码: 使用线性回归来预测房价: 四、基于Python 和 Scikit-learn 库实现逻辑回归 五、总结 线性回归的优缺点总结: 逻辑回归(Logistic…

WiFi已连接却不可上网是什么原因?

很多使用wifi上网的用户都遇到过这样的问题,就是电脑已经连接了wifi,但就是上不了网。着到底是怎么回事呢?今天,极客狗带大家一起来找找WiFi已连接却不可上网是什么原因,并给出对应的解决方。 原因分析: 可能是ip地址冲突所导致,也有可能是宽带出先故障,不妨试试下面的…

零基础入门数据挖掘系列之「特征工程」

摘要:对于数据挖掘项目,本文将学习应该从哪些角度做特征工程?从哪些角度做数据清洗,如何对特征进行增删,如何使用PCA降维技术等。 特征工程(Feature Engineering)对特征进行进一步分析&#xf…

Python - 深度学习系列30 - 使用LLaMA-Factory微调模型

说明 最实用的一种利用大语言模型的方式是进行微调。预训练模型与我们的使用场景一定会存在一些差异,而我们又不可能重头训练。 微调的原理并不复杂,载入模型,灌新的数据,然后运行再训练,保留checkpoints。但是不同项…

ExoPlayer架构详解与源码分析(12)——Cache

系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…

华为配置AP静态上线业务实验

配置AP静态上线业务示例 组网图形 图1 配置AP静态上线业务示例组网图 业务需求组网需求数据规划配置思路操作步骤配置文件扩展阅读 业务需求 管理员希望为AP配置静态IP地址,使AP能够找到正确的AC,当AP通过AC的认证后,实现AP在AC中正常上…

C++项目——集群聊天服务器项目(四)MySQL数据库

今天来介绍集群聊天器项目中MySQL数据库的相关表结构 集群聊天服务器项目需要进行好友、群组的增删操作以及好友离线状态的判断,需要在数据库中建立相关表进行增删改查操作,因此项目设计了如下五个表,大家可以自己动动小手,使用S…

机器学习——元学习

元学习(Meta Learning)是一种机器学习方法,旨在使模型能够学习如何学习。它涉及到在学习过程中自动化地学习和优化学习算法或模型的能力。元学习的目标是使模型能够从有限的训练样本中快速适应新任务或新环境。 在传统的机器学习中&#xff…

海外媒体宣发:十大国外中文网站-大舍传媒

十大国外中文网站 1、欧洲时报 覆盖欧洲且较具影响力的华文媒体 国外中文新闻网站,欧洲时报文化传媒集团旗舰日报《欧洲时报》旗下官方网站,总部设在法国巴黎,创刊于1983年,现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

发展规划--IM系统

1、时代背景 5G应用,多终端应用,物联网应用,小程序,工业互联,大数据应用等等大前端时代的到来,程序员不能只关注crud,因为以后的服务并发量只会越来越多。 高并发架构师、大数据架构师或者说j…

国内ip地址怎么改?详解修改ip地址的步骤

在网络通信中,IP地址是设备在网络上的标识,对于用户、服务器和网络安全都至关重要。然而,有时候在特定情况下,可能需要修改IP地址以满足不同需求或解决特定问题。虎观代理小二将深入研究中国国内IP地址修改的方法与影响&#xff0…

C++ explicit隐式类型转换

单参数构造函数支持隐式类型的转换 什么意思? 简单来理解就是: 一个类对象的构造函数的参数只有一个,就可以直接进行赋值传参 例如构造函数的参数为int,且只有一个int 就可以直接将int类型的整型数据转换成类对象 也就是说从int类…

Unity构建详解(3)——SBP的依赖计算

【前置知识】 先要搞清楚Asset和Object的关系,可以简单理解为一个Asset对应多个Object。 unity自定义的Asset也要有一个存储的标准,其采用的是YAML,我们看到的所有Unity自定义的Asset格式,例如.prefab(预制体&#x…

研华工控机610L学习笔记2:visualstudio与第一个C#程序

今日继续学习工控机 C# 编程相关知识: 这篇结束后我将先进行一段时间的C#的学习研究,并写一些C#的笔记 后续再更新工控机编程设计相关 目录 1、安装visualstudio: 2、创建第一个C#程序: 3、寻找C#解决方案源文件: …

linux之zabbix自定义监控

zabbix基本配置见:写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/136783672 自定义监控规则 命令为who | wc -l 显示为2,主机一个,mobaxterm一个,思路是开启3个终端,让主机的zabbix服务自动检测1…

B端设计:如何让UI组件库成为助力,而不是阻力。

首发2023-09-24 15:42贝格前端工场 Hi,我是大千UI工场,网上的UI组件库琳琅满目,比如elementUI、antdesign、iview等等,甚至很多前端框架,也出了很多UI组件,如若依、Layui、bootstrap等等,作为U…

I/O多路复用:select/poll/epoll

最基本的 Socket 模型 要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。 Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要…

基于SpringBoot图书进销存管理系统

采用技术 基于SpringBoot图书进销存管理系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户信息管理 图书类型管理 商品退货管理 客户信息管理 图…

软件测试相关内容第六弹 -- 测试实战

写在前:hello大家早中晚上好!这里是西西,前面我们已经学习了关于测试相关基础的介绍,点击链接直达前方内容~ 测试内容博客链接初识软件测试点击跳转软件测试相关概念点击跳转测试生命周期、BUG、测试大体流程点击跳转测试用例、测…

数据结构·排序

1. 排序的概念及运用 1.1 排序的概念 排序:排序是将一组“无序”的记录序列,按照某个或某些关键字的大小,递增或递减归零调整为“有序”的记录序列的操作 稳定性:假定在待排序的记录序列中,存在多个具有相同关键字的记…