QT 完美实现圆形按钮

2023-11-12

QT 版本:5.6.0

官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下)。

首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制),我以下面的图形为例:

开始制作:

一、建立 QT 工程,并加入图形资源

创建好工程,向工程中加入资源文件:

在资源文件中加入两个按钮图片,一个用于正常显示,一个用于鼠标停留的时候显示:

二、构造 MyButton 类

该类继承自 QPushButton

借助 enterEvent 与 leaveEvent 实现按钮的动态变化。

mybutton.h 文件内容:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QWidget>

class MyButton : public QPushButton
{
    Q_OBJECT

public:
    MyButton(QWidget *);

protected:
    virtual void enterEvent(QEvent *);
    virtual void leaveEvent(QEvent *);
};

#endif // MYBUTTON_H

三、实现 MyButton 类的各个接口

mybutton.cpp 文件内容:

#include "mybutton.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QBitmap>

MyButton::MyButton(QWidget *parent):
    QPushButton(parent)
{
    QPixmap pixmap(":/init.png");

    resize(pixmap.size());
    /* 设置按钮的有效区域 */
    setMask(QBitmap(pixmap.mask()));
    setStyleSheet("QPushButton{border-image: url(:/init.png);}");
}

void MyButton::enterEvent(QEvent *)
{
    setStyleSheet("QPushButton{border-image: url(:/click.png);}");
}

void MyButton::leaveEvent(QEvent *)
{
    setStyleSheet("QPushButton{border-image: url(:/init.png);}");
}

引入 QPixmap 的原因:借助 pixmap 实现按钮的 setMask 接口,该功能是禁止掉图形外的区域点击有效。

四、创建 MyButton

Widget.cpp 文件中加入:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    new MyButton(this);
    this->setWindowFlags(Qt::FramelessWindowHint);
}

运行效果:

初始按钮状态:

鼠标放上后状态:

后期补充:

设置屏蔽区域方法一:

QPixmap pixmap(":/init.png");

/* 设置按钮的有效区域 */
setMask(QBitmap(pixmap.mask()));

设置屏蔽区域方法二:

/* 半径为 35 的圆形按钮 */
setMask(QRegion(0,0,70,70,QRegion::Ellipse));

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 完美实现圆形按钮 的相关文章

随机推荐

  • Firefox火狐浏览器显示你的连接不安全,是什么意思?

    当 Firefox 连接到一个安全的网站时 网址最开始为 https 它必须确认该网站出具的证书有效且使用足够高的加密强度 以充分保护您的隐私 如果证书无法通过验证 或加密强度过低 Firefox 会中止连接到这个网站 并向您显示SSL证书
  • 纯代码干货-Python基于YOLOv5的车辆检测并计数

    首先 你需要安装YOLOv5 可以通过官方文档了解安装步骤和相关依赖 接着 你需要准备训练好的车辆检测模型和测试图片或视频 1 导入库 import cv2 import torch from models experimental imp
  • sqlite 在实现记录存在即更新,不存在就插入

    在一次写sql语句的时候突发奇想 为什么不能把插入和更新记录写在一起呢 这样一条语句就能完成两个操作了 而且有时候可能也会碰到需要这样的逻辑 于是找了还真有 但是由于sqlite是比较小型的数据库所以具体方式不太一样 insert into
  • RS485通信与Modbus协议 附源码下载

    RS485通信与Modbus协议 附源码下载 RS485通信的特点 1 采用差分信号 2 RS485通信速率快 最大传输速率可以达到10Mb s以上 3 RS485内部采用平衡驱动器和差分接收器的组合 抗干扰能力大大增加 4 传输距离最远可
  • android播放gif图片,Android SurfaceView 播放gif

    Android SurfaceView 是Android系统中的高级组件 它有自己的绘制界面 可以在一个独立的线程进行UI的绘制 因此不会阻塞主线程 这也是我们使用SuefaceView播放gif图片的原因 先简单说一下思路 gif图其实就
  • Openwrt编译python3时出现错误:No rule to make target `package//host/compile'

    步骤 1 在package目录下添加python3 包含Makefile files和相关patches文件 2 执行make package python3 compile V s make 1 No rule to make targe
  • 纯css3制作手风琴选项卡

    前言 平时工作中时常会制作手风琴以及选项卡 制作这些我们首先想到的是使用 js 操作 而其实 css3 也是可以完成 不需要使用 js 下面我们就使用 css3 完成 效果如下 手风琴 结构代码如下 ul class box li li u
  • 美团-分布式会话跟踪系统架构设计与实践

    前言 随着美团点评的业务发展 公司的分布式系统变得越来越复杂 我们亟需一个工具能够梳理内部服务之间的关系 感知上下游服务的形态 比如一次请求的流量从哪个服务而来 最终落到了哪个服务中去 服务之间是RPC调用 还是HTTP调用 一次分布式请求
  • Hibernate中用hql查询部分字段

    hql查询单表部分字段 在hibernate中 用hql语句查询实体类 采用list方法的返回结果为一个List 该List中封装的对象分为以下三种情况 1 查询全部字段的情况下 如 from 实体类 list中封装的对象为实体类本身 各属
  • 如何禁用GeForce Experience的奖励广告

    NVIDIA s GeForce Experience software now displays notification advertisements for free to play games If you don t want n
  • 系统错误!!!VCRUNTIME140.dll找不到的解决方案

    相信各位很多一定有过这样的经历 当你打开steam 打算开开心心玩一场游戏 当你打开电脑 想登个QQ 然后 太淦了 对不对 笔者百度了一下 教程挺多 不过试试我的也是可以的 至少我觉得简单实用吧 而且以后电脑软件有什么小毛病都可以试试 通过
  • 使用百度API进行情感分析(python)(二)

    编写代码 将代码中的token值改为上一篇得到的Access token值 即可 该值的时间期限约是一个月 一个月之后需要重新获取Access token值 获取方法与之前相同 代码示例 import re import requests
  • 基于.Net的权限管理快速开发框架

    一 项目简介 基于 Net的权限管理快速开发框架 二 实现功能 支持基础功能 系统设置 角色管理 用户管理 组织机构 字典管理 支持功能模块 权限管理 url权限 按钮权限 支持定时任务 在线的定时任务 任务调度 执行结果 支持基本的日志管
  • C++实例(十二)图形绘制

    一 特殊曲线 绘制蜗牛线 绘制贝塞尔曲线 拖动绘制曲线 绘制正弦曲线 绘制立体模型 交叉线条 绘制尼哥米德蚌线 艺术图案万花筒 绘制抛物线 等电位面图 沙丘图案 绘制艺术图案 立体三棱锥 二 图形基础 创建不同的画刷 指定颜色填充矩形区域
  • 更多提高正则表达式效率的方法

    原文 http wyzws iteye com blog 1274020 让匹配更快失败 尤其是匹配很长的字符串时 匹配失败的位置要比成功的位置多得多 以简单 必须的字元开始 排除明显不匹配的位置 如锚点 或 特殊字符 x或 u263A 字
  • win32 消息循环

    windows系统把应用程序的输入事件传递给各个窗口 每个窗口有一个函数 称为窗口消息处理函数 窗口消息处理函数处理各种用户输入 处理完成后再将控制权交还给系统 窗口消息处理函数一般是在注册一个窗口的时候指定的 在Windows下 只有那些
  • linear-gradient为啥只能background不能background-color

    background 可以设置 背景颜色 背景图片 定位等 而background color 只能设置 背景颜色 设置background color aaa 此时仅仅改专变了背景色 但此时有一个默认的的background repeat
  • 什么是OAuth

    什么是OAuth OAuth 全称 Open Authorization 中文翻译开放授权 是一种基于令牌的身份验证 允许组织跨第三方服务共享信息 而无需公开用户的用户名 密码 本质上 OAuth是为第三方服务提供令牌的中间人 该令牌只允许
  • android按日期函数查询,Android开发中SQLite存储时间和按日期函数查询

    Android开发中SQLite存储时间和按日期函数查询 Android开发中SQLite存储时间和按日期函数查询 在Android开发中 在消息模块中 消息做数据库缓存处理 排序查询或指定时间查询需要用时间和日期函数 本篇简括 存储时间字
  • QT 完美实现圆形按钮

    QT 版本 5 6 0 官方的按钮有些普通 如果我们想要换成自己喜欢的按钮而却无从下手 那么请继续往下阅读 皮一下 首先 可以在网络上搜索一下自己喜欢的按钮图形 或者可以自行绘制 我以下面的图形为例 开始制作 一 建立 QT 工程 并加入图