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…

Day30:学习SpringCloud

学习计划:完成尚硅谷的尚上优选项目 学习进度:完成尚上优选项目的前置知识点:SpringCloud 知识点: MQ高级 惰性队列 消息堆积问题惰性队列 MQ集群 集群分类普通集群镜像集群仲裁队列

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

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

DeepLearning in Pytorch|手写数字识别器_minst_convnet

目录 概要 一、代码概览 二、使用步骤 1.引入库 2.超参数的定义和数据集的预处理 3.构建网络 4.训练 5.测试 三、剖析 1.各层运算 2.健壮性实验 总结 概要 系列文章为《深度学习原理与Pytorch实践》学习笔记 Pytorch 2.2.1 (CPU) Python 3.6.13|Anaconda 环境 一、代码概览 …

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

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

VUE3 网络异步操作的两种方式

描述 开发过程中,我需要先通过网络请求1获取一个值,通过得到的值去作为网络请求2 的输入。如代码所示: // 请求1,得到number1.value api.diagnose({state:"readwave", index:index}).then(res >{number1.value re…

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

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

html5cssjs代码 037 多列显示

html5&css&js代码 037 多列显示 一、代码二、解释1. 设置column-count2. 调整column-gap3. 自定义列宽度4. 应用到HTML元素注意事项 在HTML中,要实现多列显示,通常会使用CSS的column属性。这个属性允许你将内容自动分割成多个列,类似…

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年,现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

ic到底还能不能入了?

不管你同意与否,这是我目前的观点: IC行业的高薪只要一天不降,对于普通家庭的孩子来说就是一个值得进入的行业。 但它的入行门槛只会越来越高直到达到一个高点并维持住。之前可能是科班硕士就能找到工作,现在就需要28所起步才可…

发展规划--IM系统

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

数据结构-双向链表-003

1双向链表 1.1链表结点结构体定义 typedef struct student_data {char name[32];char sex;int age; }STU_DATA;typedef struct double_link_node {STU_DATA data;//数据域struct double_link_node *ppre;//指向上一个结点的指针struct double_link_node *pnext;//指向下一个结…

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

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

【算法】堆排序

1. 堆排序简介 堆排序(heapsort)是由 J. W. J. Williams 于 1964 年发明的。是一种基于比较的排序算法,和选择排序一样,堆排序将数据序列分为已排序区域和未排序区域两部分。通过从未排列区域中获取最大元素并将其插入已排序区域,迭代这个操作来缩小未排序区域。与选择排…

2024年华为OD机试真题-二叉树的广度优先遍历-Python-OD统一考试(C卷)

题目描述: 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出层次遍历的结果。 输入描述: 输入为两个字符串,分别是二叉树的后续遍历和…

LeetCode第三天(645. 错误的集合)

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结果。 请你找出重复出…