【Qt】贴图实现方向控制盘

2023-11-11

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iriczhao/article/details/122052059
————————————————

一、效果走一波请添加图片描述
二、使用贴图进行不规则按钮的设计与开发

开发环境描述:QtCreator + Qt Desinger

(1)首先准备待贴的图片

​ 图片的切片大小必须一样,背景为透明的;将待贴的所有图片都切下来,文件标明名称与尺寸大小,便于管理与查询。

​ 【注意事项】
​ 1、当使用贴图时,说明软件那部分的UI界面基本完成了设计。在进行贴图素材切片时,一定要注意贴图区域功能的分离。

​ 2、所有的切片操作都必须在一个固定大小的区域内进行,即切片出来的所有图片的尺寸大小全都保持一致。由于这一点,在切片前需要考虑功能的完整性,和实际的贴图效果。

(2)在Qt Creator中创建待贴图的QPushButton创建5个待贴图的按钮(QPushButton)

(3)将所有的按钮移动到一个位置上,这一步非常关键,如果不移动到一个位置上,贴图会出现位置不一致的情况。

在这里插入图片描述

(4)使用setMask()函数进行贴图

    QPixmap btn_1(":/assets/images/bg_image_pink_4_03.png");
    ui->pushButton->setIconSize(btn_1.size());
    ui->pushButton->resize(btn_1.size());
    ui->pushButton->setMask(btn_1.mask());
    ui->pushButton->setStyleSheet("QPushButton{border:0px;border-image:url(:/assets/images/bg_image_pink_4_03.png)}"
                                  "QPushButton:pressed{border-image:url(:/icons/largeDisplayIcon_normal_128.png)};"
                                  "QPushButton:hover{border-image:url(:/icons/largeDisplayIcon_clieked_128.png)};");

​ 按照以上代码,逐一设置5个待贴图的按钮。在setStyleSheet()函数中可以设置按钮的样式表。

​ 通过以上步骤,就完成一个自定义按钮的贴图。但是最重要的一点:那就是Qt开发一个软件UI,如果使用到了贴图进行UI实现,不使用QPainter自绘制。最好将贴图部分都分离出来,做成单独的QWidget控件。这样,可以避免设计的关联性太强;当设计修改时,只用改动局部的设计即可。

(5)按钮的使用与QPushButton、QToolButton一样。

三、【核心代码】
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_TranslucentBackground);

    //设置背景贴图
    QPixmap pixmap;
    pixmap.load(":/assets/bgimage.png");
    resize(pixmap.size());
    setMask(pixmap.mask());
	
    //顶部按钮
    QPixmap topBtn(":/assets/topBtn.png");
    ui->pushButton->setIconSize(topBtn.size());
    ui->pushButton->resize(topBtn.size());
    ui->pushButton->setMask(topBtn.mask());
    ui->pushButton->setStyleSheet("QPushButton{border:0px;border-image:url()}"
                                    "QPushButton:pressed{border-image:url(:/assets/topBtn.png)};");
	//左侧按钮
    QPixmap leftBtn(":/assets/leftBtn.png");
    ui->pushButton_2->setIconSize(leftBtn.size());
    ui->pushButton_2->resize(leftBtn.size());
    ui->pushButton_2->setMask(leftBtn.mask());
    ui->pushButton_2->setStyleSheet("QPushButton{border:0px;border-image:url()}"
                                    "QPushButton:pressed{border-image:url(:/assets/leftBtn.png)};");
	
    //底部按钮
    QPixmap bottomBtn(":/assets/bottomBtn.png");
    ui->pushButton_3->setIconSize(bottomBtn.size());
    ui->pushButton_3->resize(bottomBtn.size());
    ui->pushButton_3->setMask(bottomBtn.mask());
    ui->pushButton_3->setStyleSheet("QPushButton{border:0px;border-image:url()}"
                                    "QPushButton:pressed{border-image:url(:/assets/bottomBtn.png)};");
	//右侧按钮
    QPixmap rightBtn(":/assets/rightBtn.png");
    ui->pushButton_4->setIconSize(rightBtn.size());
    ui->pushButton_4->resize(rightBtn.size());
    ui->pushButton_4->setMask(rightBtn.mask());
    ui->pushButton_4->setStyleSheet("QPushButton{border:0px;border-image:url()}"
                                    "QPushButton:pressed{border-image:url(:/assets/rightBtn.png)};");
	//中间按钮
    QPixmap centerBtn(":/assets/centerBtnImage.png");
    ui->pushButton_5->setIconSize(centerBtn.size());
    ui->pushButton_5->resize(centerBtn.size());
    ui->pushButton_5->setMask(centerBtn.mask());
    ui->pushButton_5->setStyleSheet("QPushButton{border:0px;border-image:url()}"
                                    "QPushButton:pressed{border-image:url(:/assets/centerBtnImage.png)};");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    painter.drawPixmap(0,0,QPixmap(":/assets/bgimage.png"));
}
四、尾

您的点赞和关注,是我持续创作的动力。

搜索关注【嵌入式小生】wx公众号回复关键字【1011】即可获取本文的源码工程,也可获取更多精彩内容。
请添加图片描述

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

【Qt】贴图实现方向控制盘 的相关文章

随机推荐

  • 笨办法学python 习题28

    习题28 返回值 python 都是给布尔表达式返回的两个被操作对象中的一个 而非False和True False and 1 gt False True and 1 gt 1 此处就涉及到短路逻辑 短路逻辑 简单理解 第一句中 False
  • docker容器cpu使用率——通过修改对应的Cgroup配置文件cpu.cfs_quota_us的值来实现

    root bogon docker run itd centos stress bin bash b0237fc264dec2ace935f917e8079d98ee4135c7f980666c59c2793ec56f9871 root b
  • IntelliJ IDEA 创建 Git 分支并且 Push 到远程

    在 IntelliJ 的右下角 你可以看到当前的 Git 分支 然后你可以单击这个分支后 在弹出的界面的最上方有一个新建分支的选项 然后再弹出的界面中 输入你要创建的分支名称后回车输入 然后从项目中找到需要的 Git 选项 然后在仓库中选择
  • python通过setup.py安装模块(源码安装) vs pip install

    python安装模块不止可以pip install 还有其他的方法 还可以用setup py 这也就是所谓的从源码安装 并且有些时候我们发现一些模块没有提供pip install 命令和安装教程 只提供了一个setup py文件 步骤 cd
  • 【华为机试真题Python】从入门到入职-真题列表导读

    写在前面 本专栏有100 道题 持续更新中 都是往期的HW机试真题 根据过往同学的经验基本都会考到原题 大家有什么不懂的都可以留言 华为机试有三道题目 第一道和第二道属于简单或中等题 分值为100分 第三道为中等或困难题 分值为200分 总
  • 图机器学习课程笔记5

    维生素C吃多了会上火 个人CSDN博文目录 cs224w 图机器学习 2021冬季课程学习笔记集合 目录 1 思维大纲 2 中文笔记 1 思维大纲 2 中文笔记 笔记5 提取码 1111
  • stm32f103使用DM542控制42相步进电机的原理和可行性分析

    步进电机是一种能够实现准确位置控制的电机 通常应用于需要高精度定位的场合 例如3D打印机 机器人和自动化系统等 而STM32F103是一种高性能 低功耗的微控制器 它拥有广泛的外设 适合用于控制各种电机 本文将介绍使用STM32F103控制
  • 【数据手册】LM1117L3芯片的使用

    1 特征 可调或固定输出 1A输出电流 低损耗 在1A输出电流时最大电压为1 3V 0 04 的线路调节 0 2 负载调节 100 热极限燃烧 快速瞬态响应 2 描述 LM1117系列正可调和固定调节器设计提供1A高电流效率 所有内部电路设
  • Python基础入门(一)——Anaconda的安装

    人生苦短 我用Python 相比C Java等开发语言 Python给大多数人的感觉都是入手容易啊 同时它又是数据分析 智能运算的利器 所以学的人 用的人 你懂的 那么 让我们一起开始Python之旅吧 当然 先从最简单的开始 1 先上一个
  • CSerialPort教程4.3.x (6) - CSerialPort作为第三方库的使用

    CSerialPort教程4 3 x 6 CSerialPort作为第三方库的使用 环境 系统 windows 10 CentOS 7 cmake 3 22 1 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库
  • 在linux下如何使用yum查看安装了哪些软件包

    Linux系统下yum命令查看安装了哪些软件包 yum list installed 列出所有已安装的软件包 yum针对软件包操作常用命令 1 使用YUM查找软件包 命令 yum search 2 列出所有可安装的软件包 命令 yum li
  • ubuntu小技巧24--快速入门ffmpeg

    ubuntu小技巧24 快速入门ffmpeg 1 介绍 2 使用方法 2 1 ffmpeg命令剪辑音视频文件 2 2 python脚本剪辑音视频文件 3 注意事项 4 说明 1 介绍 FFmpeg是一套可以用来记录 转换数字音频 视频 并能
  • kernel创建线程

    kernel判断是否是用户进程 之前在上述文章中说到kernel中的线程通过kthreadd创建而来 今天说一下这个过程 static noinline void init refok rest init void int pid rcu
  • librosa安装错误

    一开始的错误 AttributeError type object h5py h5 H5PYConfig has no attribute reduce cython 解决办法 卸载h5py然后安装librosa conda install
  • Python 装饰器详解

    1 为什么需要装饰器 Leader让小A写两个数字相加和相减的函数 小A很快就写完了 def add x y return x y def sub x y return x y if name main result add 1 2 pri
  • SpringBoot多数据源nacos配置

    1 背景 因新项目对旧系统业务的重构 原有业务也只有单一数据源 项目开发到后期 现场存在历史数据迁移问题 在讨论后希望系统支持多数源的方式解决对历史数据同步调用的问题 项目的配置文件为nacos配置 涉及多个现场的升级部署 因此希望改动影响
  • Python爬虫:保姆级教你完成数据存储

    数据存储 在前面的几篇文章中 我分别总结了 什么是爬虫 requests模块总结 正则表达式提取数据 XPath解析数据 Beautiful Soup解析数据 pyquery解析数据 jsonpath提取json数据 在上面的几篇文章当中都
  • 微云网页版服务器繁忙,腾讯微云传输速度慢的几种原因及解决方法

    大家经常使用腾讯微云吧 不过大家知道腾讯微云传输速度慢怎么办吗 下面小编就给大家分享腾讯微云传输速度慢的几种原因及解决方法 希望会对你有所帮助 腾讯微云传输速度慢的几种原因及解决方法 1 网络宽带本身速度慢 解决办法 当处于网络使用高峰期的
  • JMeter 实时监控仪表板配置 (Grafana + InfluxDB)

    在服务器上跑 JMeter 做压测的话 给工具本身也配上实时监控是必须的 命令行输出能提供的信息太少 JMeter的 Backend Listener 支持 Graphite 和 InfluxDB 这里选择 InfluxDB 做时序数据库
  • 【Qt】贴图实现方向控制盘

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net iriczhao article details 122052059 一 效果走一波