Qt QPushButton 按钮添加数字气泡

news2024/9/20 20:27:27

使用场景

项目中,在某个按钮的右上角添加数字气泡是一个很常见的功能,可以用新建一个组合类来实现。不过这样比较麻烦,如果加气泡是后面的需求,可能改动的地方较多。

下面介绍2种比较简单,不需要改动按钮响应的方式。

实现效果图

方案1

方案2

实现 

方案1:直接在按钮内部贴一个 QLabel

这种情况按钮不能太小,按钮的图片不能占整个按钮最好不要太满。不然效果不理想。

#pragma once

#include <QtWidgets/QWidget>
#include "ui_pafeyDemo.h"
#include <QLabel>

class pafeyDemo : public QWidget
{
	Q_OBJECT

public:
	pafeyDemo(QWidget *parent = Q_NULLPTR);

private:
	Ui::pafeyDemoClass ui;

	QLabel *m_pLabelToolRed;
};
#include "pafeyDemo.h"

pafeyDemo::pafeyDemo(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	m_pLabelToolRed = 0;

	connect(ui.pushButtonShow,&QPushButton::clicked,this, [=](){
		if (0 == m_pLabelToolRed)
		{
			m_pLabelToolRed = new QLabel(ui.btTool);
			m_pLabelToolRed->setObjectName("btToolNew"); // 设置子控件的对象名
			m_pLabelToolRed->setFixedSize(16, 16); // 设置小圆点大小 
			//m_pLabelToolRed->setStyleSheet("background-color: rgba(255, 255, 255, 0);border-image: url(:/pafeyDemo/Resources/bar/bar_new.png);"); // 设置小圆点样式 
			m_pLabelToolRed->setStyleSheet("QLabel{background-color: rgb(255, 85, 0);color: rgb(255, 255, 255);border-radius:8px}"); // 设置小圆点样式 
			m_pLabelToolRed->move(ui.btTool->width() - 16, 0); // 将小圆点移动到右上角 
			m_pLabelToolRed->setText("96");
			m_pLabelToolRed->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
		}
		m_pLabelToolRed->show();
	});
	connect(ui.pushButtonHide, &QPushButton::clicked, this, [=]() {
		m_pLabelToolRed->hide();
	});
	connect(ui.pushButtonNum, &QPushButton::clicked, this, [=]() {
		int num = m_pLabelToolRed->text().toInt()+1;
		if (num>99)
		{
			m_pLabelToolRed->setFixedSize(22, 16); // 设置小圆点大小 
			m_pLabelToolRed->move(ui.btTool->width() - 22, 0); // 将小圆点移动到右上角 
			m_pLabelToolRed->setText(QString("99+"));
		}
		else
		{
			m_pLabelToolRed->setText(QString::number(num));
		}
	});
	
}

要注意的是,红色气泡 QLabel 的长宽动态决定了 border-radius: 8px 的值,radius是长宽一半。

如果气泡的数字超过99,需要显示 99+ 的时候,可以加大 QLabel 的宽度。

我这个按钮比较小,99+的时候就挡住按钮本身比较多了。

效果不理想,那就可以用另一方案了。 

方案2:把按钮放在一个 QWidget 里面,再把气泡 QLabel 放在Qwidget 上。
#include "pafeyDemo.h"

pafeyDemo::pafeyDemo(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	m_pLabelToolRed = 0;

	ui.widgetBubble->setFixedSize(50,50);

	connect(ui.pushButtonShow,&QPushButton::clicked,this, [=](){
		if (0 == m_pLabelToolRed)
		{
			//m_pLabelToolRed = new QLabel(ui.btTool);
			m_pLabelToolRed = new QLabel(ui.widgetBubble);
			m_pLabelToolRed->setObjectName("btToolNew"); // 设置子控件的对象名
			m_pLabelToolRed->setFixedSize(16, 16); // 设置小圆点大小 
			//m_pLabelToolRed->setStyleSheet("background-color: rgba(255, 255, 255, 0);border-image: url(:/pafeyDemo/Resources/bar/bar_new.png);"); // 设置小圆点样式 
			m_pLabelToolRed->setStyleSheet("QLabel{background-color: rgb(255, 85, 0);color: rgb(255, 255, 255);border-radius:8px}"); // 设置小圆点样式 
			//m_pLabelToolRed->move(ui.btTool->width() - 16, 0); // 将小圆点移动到右上角 
			m_pLabelToolRed->move(ui.widgetBubble->width() - 16, 0); // 将小圆点移动到右上角 
			m_pLabelToolRed->setText("96");
			m_pLabelToolRed->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
		}
		m_pLabelToolRed->show();
	});
	connect(ui.pushButtonHide, &QPushButton::clicked, this, [=]() {
		m_pLabelToolRed->hide();
	});
	connect(ui.pushButtonNum, &QPushButton::clicked, this, [=]() {
		int num = m_pLabelToolRed->text().toInt()+1;
		if (num > 99)
		{
			m_pLabelToolRed->setFixedSize(22, 16); // 设置小圆点大小 
			//m_pLabelToolRed->move(ui.btTool->width() - 22, 0); // 将小圆点移动到右上角 
			m_pLabelToolRed->move(ui.widgetBubble->width() - 22, 0); // 将小圆点移动到右上角 
			m_pLabelToolRed->setText(QString("99+"));
		}
		else
		{
			m_pLabelToolRed->setText(QString::number(num));
		}
	});
	

}

其实就是把 QLabel 的父句柄改为 QWidget 即可。

原来的按钮放在 QWidget 中间,气泡放在 QWidget 的右上角。

如果想让气泡压住图标一点可以再调整一下纵坐标。

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

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

相关文章

Web3社交新经济,与 SOEX 实现无缝交易的高级安全性

出于充分的理由&#xff0c;安全性是交易中至关重要的考虑因素。每个人都应该确保自己的资金在交易时是安全的。由于 &#xff33;&#xff2f;&#xff25;&#xff38; 充当您与交易所的最佳连接&#xff0c;因此必须强调的是&#xff0c;该系统不会引发任何安全问题。 &a…

央视曝光“硫超标”枸杞,记者直击加工现场:被熏到泪流不止

枸杞&#xff0c;这一自古以来便被誉为“药食同源”的珍贵食材&#xff0c;不仅承载着中华民族深厚的养生智慧&#xff0c;也广泛融入现代人的日常饮食与保健之中。 从食品、饮料到保健品&#xff0c;枸杞的身影无处不在&#xff0c;其独特的营养价值与药用价值深受消费者青睐。…

心电调试笔记

原理图设计 注意事项 引脚连接检查&#xff1a;确保每个元器件与芯片引脚连接正确是基础&#xff0c;错误的连接可能导致系统无法正常工作。未连接引脚标识&#xff1a;对于未使用的引脚&#xff0c;虽然不连接但应标识为非使用状态&#xff0c;以免混淆或引起误操作。测试点设…

【 html+css 绚丽Loading 】 000034 三元聚散盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

解锁MySQL数据库基础命令:从入门到精通的实战指南

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 前言&#xff1a;…

PLUTO: 推动基于模仿学习的自动驾驶规划的极限

PLUTO: Pushing the Limit of Imitation Learning-based Planning for Autonomous Driving PLUTO: 推动基于模仿学习的自动驾驶规划的极限 https://arxiv.org/abs/2404.14327 Abstract We present PLUTO, a powerful framework that Pushes the Limit of imitation learn…

【扇贝编程】python爬虫——爬取动态网页笔记

在示例网站上登陆后点开第一条请求&#xff08;wp-login.php&#xff09;。右边的 Headers 里可以看到请求地址&#xff08;Request URL&#xff09;为 https://wpblog.x0y1.com/wp-login.php&#xff0c;请求方式&#xff08;Request Method&#xff09;是 POST&#xff0c;状…

戴尔科技领涨市场,AI服务器需求成关键驱动力

戴尔科技强劲上涨&#xff0c;AI服务器需求激增 戴尔科技公司日内股价飙升4.2%&#xff0c;达到115.42美元&#xff0c;接近一个月高点。这一强劲表现主要得益于该公司上调了年度盈利预期&#xff0c;原因是对Nvidia驱动的人工智能优化服务器的需求显著增加。戴尔将2025财年的年…

RTC(实时时钟)/BKP(备份寄存器

1 unix时间戳 2 时间戳转换函数 3 BKP&#xff08;备份寄存器&#xff09; 1 TAMPER引脚侵入事件 2 RTC校准时间 3 RST闹钟脉冲和秒脉冲 可以输出出来为其他信号提供 4 校准时钟&#xff0c;寄存器加输出RTC校准时钟 5 总结&#xff1a;3个功能只能同时使用一个 4 BKP基本…

windows屏幕录制:探索四款顶级录屏工具!

在数字化时代&#xff0c;我们经常需要记录屏幕上的操作&#xff0c;无论是为了教学、演示还是娱乐。Windows操作系统提供了多种录屏工具&#xff0c;这些工具各有特色&#xff0c;能够满足不同用户的需求。本文将为您介绍几款备受好评的录屏软件&#xff01; 福昕录屏大师 直…

【RabbitMQ】核心概念

界⾯上的导航栏共分6部分, 这6部分分别是什么意思呢, 我们先看看RabbitMQ的工作流程 1. Producer和Consumer Producer:生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息 Consumer: 消费者,也是RabbitMQ Server的客户端,从RabbitMQ接收消息 Broker:其实就是RabbitMQSer…

ABAP Dialog Radio Button

额.妈了个巴子&#xff0c;整了一天&#xff0c;才发现&#xff0c;原来Dialog 的Radio Button 是要右键去设置组的 我就说为什么不行咧 误区&#xff1a;我以为是属性那里的组去设置的

shell脚本编写之四则运算

shell程序默认支持整数加、减、乘、除、求余的运算。 1、使用$(())方式进行运算 例如计算23&#xff0c;使用$((23))。 我在脚本中加入这几种运算进行测试&#xff1a; 执行脚本后结果如下&#xff1a; 2、使用$[]方式进行运算 例如计算23&#xff0c;使用$[23]&#xff0c…

我在高职教STM32——ADC电压采集与光敏电阻(5)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课…

flutter文本输入框使用

在Flutter中&#xff0c;实现输入框一般使用TextField&#xff0c;通过设置它的属性给输入框和内部文字设置不同的样式。 Flutter 输入框实现简单例子 import package:flutter/material.dart;class MyEditPage extends StatelessWidget {const MyEditPage({super.key});overr…

算法训练第30天|46. 携带研究材料(01背包问题)|416. 分割等和子集

先讲一下01背包问题&#xff1a; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 这道题目如果使用暴力解法&#xff0c;即回溯法来做的…

Transformer简明笔记:文本翻译

Bert和gpt都是基于transformer的&#xff0c;在此之前流行的是rnn&#xff0c;复杂度有限且效率不高&#xff0c;容易受到文本长度的限制。 项目地址:https://github.com/lansinuote/Transformer_Example b站视频&#xff1a;https://www.bilibili.com/video/BV19Y411b7qx?p9&…

Java项目: 基于SpringBoot+mysql旅游网站管理系统分前后台(含源码+数据库+开题报告+PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql旅游网站管理系统分前后台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作…

【java入门】JDK的下载安装与配置,最新最详细教程!

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主、华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f970; &#…

创意微型学生机床工具——金属车床

劳技课程是实施劳动与技术教育的主要途径&#xff0c;具有基础性、实践性、综合性和创新性等特点。它不仅是国家课程、地方课程和校本课程的统一体&#xff0c;还是基础教育课程体系中的重要一环。 劳技课程强调学生的动手操作能力和实践体验&#xff0c;通过具体的技术活动和劳…