在项目中有时候会用到类似开关的控件, Qt中很多专属控件都需要自己去定义或者绘制,本次是使用QToolButton进行封装成开关的样式。我使用的控件大小是120x64,所以绘制圆的时候坐标需要根据项目的设计增加进行改变。
## 运行结果
## 代码实现
## 项目中使用
1.运行结果:



2.代码实现

#pragma once
#include <qtoolbutton.h>
#include <QPainter>
#include <QPaintEvent>
class SwitchButton : public QToolButton
{Q_OBJECT
public:explicit SwitchButton(QWidget* parent = nullptr);void setSwitchText(const QString leftText, const QString rightText);
protected:void paintEvent(QPaintEvent* pEvent);private:void drawBackGround(QPainter* painter);void drawRound(QPainter* painter);void drawText(QPainter* painter);
private:QString m_strLeftText;QString m_strRightText;
};#include "SwitchButton.h"
#include <QLinearGradient>
SwitchButton::SwitchButton(QWidget* parent): QToolButton(parent), m_strLeftText(""), m_strRightText("")
{this->setCheckable(true);
}void SwitchButton::setSwitchText(const QString text, const QString rightText)
{m_strLeftText = text;m_strRightText = rightText;this->update();
}void SwitchButton::paintEvent(QPaintEvent* pEvent)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);this->drawBackGround(&painter);this->drawRound(&painter);this->drawText(&painter);QToolButton::paintEvent(pEvent);
}void SwitchButton::drawBackGround(QPainter* painter)
{if (this->isChecked()){painter->setBrush(QBrush(QColor(10, 77, 83)));painter->drawRoundedRect(0, 0, 120, 64, 35, 35);}else{painter->setBrush(QBrush(QColor(98, 110, 120)));painter->drawRoundedRect(0, 0, 120, 64, 35, 35);}
}void SwitchButton::drawRound(QPainter* painter)
{painter->setPen(Qt::NoPen);if (this->isChecked()){QLinearGradient lineGradient(8, 8, 48, 48);lineGradient.setColorAt(0, QColor(0, 251, 234));lineGradient.setColorAt(1, QColor(0, 146, 136));lineGradient.setSpread(QGradient::PadSpread);painter->setBrush(QBrush(lineGradient));painter->drawRoundedRect(8, 8, 48, 48, 24, 24);}else{painter->setBrush(QBrush(QColor(220, 222, 224)));painter->drawRoundedRect(64, 8, 48, 48, 24, 24);}
}void SwitchButton::drawText(QPainter* painter)
{QPen pen;pen.setWidth(8);painter->setBrush(Qt::NoBrush);painter->setFont(QFont("Source Han Sans CN", 18));if (this->isChecked()){pen.setColor(QColor(255, 255, 255));painter->setPen(pen);painter->drawText(18, 19, 27, 27, Qt::AlignCenter, m_strLeftText);}else{pen.setColor(QColor(98, 111, 120));painter->setPen(pen);painter->drawText(71, 19, 34, 27, Qt::AlignCenter, m_strRightText);}
}

3.项目中使用

将刚才拖进去的QToolButton进行提升,输入封装的类名和头文件所在目录后,点击添加,添加完成,点击提升就可以

Qt使用QToolButton封装实现开关功能相关推荐

  1. 策略模式(封装一系列的功能,使之可以相互替换)

    策略模式和工厂方法模式很类似(感觉策略模式是工厂方法模式的一部分) 策略模式就是将一系列的功能封装起来(用工厂方法模式封装),使之可以相互替换(C++多态调用),从而使功能更加独立,与客户程序的耦合性 ...

  2. QT使用SQLite数据库实现登录功能

    QT实现用户登录功能(MySQL) https://blog.csdn.net/tianya_team/article/details/72566198 QT5中使用SQLite https://bl ...

  3. Springmvc借助SimpleUrlHandlerMapping实现接口开关功能

    一.接口开关功能 1.可配置化,依赖配置中心 2.接口访问权限可控 3.springmvc不会扫描到,即不会直接的将接口暴露出去 二.接口开关使用场景 和业务没什么关系,主要方便查询系统中的一些状态信 ...

  4. 纯js封装一个多功能弹出框

    不借助其它的css代码和图片资源,可直接调用. 原创内容,请勿转载. 注意,不要直接复制文章里的封装代码,因为编辑器的原因,无论怎么编辑,它还是给修改了代码.文末提供了封装代码的下载地址(无需积分) ...

  5. 沈阳计算机ps自锁按键开关,点按式轻触开关如何实现自锁轻触开关带锁按键开关功能?...

    最近经常接到有客户咨询自锁轻触开关,自锁按键轻触开关,带锁开关的产品,接下来颖鑫就教大家如何通过电路把点按式轻触开关实现成自锁轻触开关,自锁按键轻触开关,带锁开关: 首先我们先了解什么是自锁轻触开关? ...

  6. 功放板加开关音量_一种带音量开关功能的音响功放板的制作方法

    本实用新型涉及音响功放板领域,尤其涉及一种带音量开关功能的音响功放板. 背景技术: 随着时代的变化,人们对于技术的研究飞速,人们的生活中越来越多的工具,其中也缺少不了音响功放板这些设施,在人们使用的过 ...

  7. FFmpeg开发(五)——Qt视频播放器之封装FFmpeg类(参考了暴风影音、迅雷影音)

    FFmpeg开发(五)--Qt视频播放器之封装FFmpeg类(参考了暴风影音.迅雷影音) 上一篇介绍了,使用Qt和FFmpeg写的播放器.页面大家可以点进去查看和下载. FFmpeg开发(四)--Qt ...

  8. 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)

    QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...

  9. QT上实现文件拖拽功能

    转自于QT上实现文件拖拽功能 声明dragEnterEvent和dropEvent事件函数,对窗口的拖拽行为进行处理 // 由MainWindow来截取拖拽事件 ①ui->lineEdit-&g ...

最新文章

  1. AngularJs2与AMD加载器(dojo requirejs)集成
  2. ASP.NET中验证控件的使用
  3. Python 多种算法模型对比
  4. leetcode132. 分割回文串 II
  5. matlab怎么画园与椭圆,[转载]【MATLAB】画圆和椭圆
  6. mycat数据库中间件透明实现MYSQL读写分离
  7. string.Empty与,null的区别
  8. html怎么将背景图片旋转,css怎么旋转图片?
  9. xpos兼容android最高版本,[原创]学习篇-xposed框架及高版本替代方案
  10. Win7系统运行慢如何解决?——系统天地
  11. 不要找我了,我要去盘核桃了!
  12. could not get batchedbridge, make sure your bundle is packaged correctly
  13. typo:in word ‘ ‘ 问题解决方法
  14. 360城市全景,开启全新城市探索方式
  15. HUAWEI Sound Joy首发体验,独具一格的华为音质究竟如何呢?
  16. 狠补基础-数学+算法角度讲解卷积层,激活函数,池化层,Dropout层,BN层,全链接层
  17. 短视频消重批量处理软件,短视频伪原创工具,火山头条快手秒拍 今日头条自媒体搬运原创视频批量去...
  18. Hutool XML 转JSON 后 parseArray踩坑
  19. MODBUS通讯协议解析及实例
  20. 基础知识【H5新增知识1】

热门文章

  1. 视频基础教程之——How To Kiss Someone Passionately
  2. java开源框架有哪些_常用的Java微服务开源框架有哪些呢
  3. 俞敏洪力荐:“鬼才”英语记忆法,只需20分钟,轻松记完500单词
  4. 努比亚红魔7pro评测怎么样
  5. linux 一键脚本搭建,Red5一键安装脚本(LinuxWin):一键搭建你的直播平台
  6. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.4 正确掌握拍摄姿势
  7. 课程实验 【八路抢答器】
  8. 交互设计课程心得体会
  9. 网格布局中 grid-template
  10. scipy回归分析_销量预测方法及案例分析