Qt 之自定义控件(开关按钮)
Qt自定义控件13:继承QPushButton自绘按钮

有两种方式一个是继承 QPushButton;一个是继承 QWidget
这里选择继承 QPushButton(方便点)
要实现控件一下效果


需要重写paintEvent(QPaintEvent *event)

#include "SwitchControlButton.h"
#include<QPainter>SwitchControlButton::SwitchControlButton(QWidget *parent ):QPushButton(parent)
{setCheckable(true);this->setMinimumWidth(height()*2);//圆角this->setStyleSheet("QPushButton{ border-radius:10px;}");}
SwitchControlButton::~SwitchControlButton()
{}
void SwitchControlButton::paintEvent(QPaintEvent *event)
{//绘制准备工作,启用反锯齿QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);drawBackground(&painter);drawRect(&painter);drawText(&painter);
}
void SwitchControlButton::drawText(QPainter *painter)
{int width = this->width();int height = this->height();painter->save();QRect rect;if (isChecked()){rect = QRect(0, 0, width-height, height);}else{rect = QRect(height, 0, width - height, height);}QFont font = painter->font();painter->setFont(font);QString text = this->text();painter->setPen(m_textColor);painter->drawText(rect, Qt::AlignCenter, text);painter->restore();
}
void SwitchControlButton::drawBackground(QPainter *painter)
{int width = this->width();int height = this->height();painter->save();if (isChecked()){painter->setBrush(m_CheckedBgColor);}else{painter->setBrush(m_unCheckedBgColor);}QRect rect(0, 0, width, height);painter->setPen(Qt::NoPen);painter->drawRect(rect);painter->restore();}void SwitchControlButton::drawRect(QPainter *painter)
{int width = this->width();int height = this->height();painter->save();painter->setPen(Qt::NoPen);painter->setBrush(QColor(255,255,255));QRect rect;if (isChecked()){rect = QRect(width - height,0, height, height);}else{rect= QRect(0, 0, height, height);}painter->drawRoundRect(rect);painter->restore();
}

需要注意的地方有:
绘制背景:void SwitchControlButton::drawBackground(QPainter *painter)
需要设置

painter->setPen(Qt::NoPen);

qt自带的Pen是黑色一像素的笔,会给在背景中加黑框。
如果不需要框出按键,就去掉pen

设置文字时注意 drawText(QPainter *painter)
不要让白色的按钮遮挡文字,所以要计算文字显示的位置,然后放置文字:

 QRect rect;if (isChecked()){rect = QRect(0, 0, width-height, height);}else{rect = QRect(height, 0, width - height, height);}QFont font = painter->font();painter->setFont(font);QString text = this->text();painter->setPen(m_textColor);painter->drawText(rect, Qt::AlignCenter, text);

如果想要绘制圆角的 按钮
这里配置qss时不管用的,因为我们重写了paintEvent事件
所以我们要在paintEvent事件更改

上图样式要更改两个地方

背景绘制函数

void SwitchControlButton::drawBackground(QPainter *painter)
{//painter->drawRect(rect);这个是直角矩形painter->drawRoundedRect(rect, 4, 4);//改成圆角矩形
}

绘制小方框的函数
void SwitchControlButton::drawRect(QPainter *painter)
{
painter->drawRoundedRect(rect,3, 3);
//painter->drawRoundRect(rect);
}
这里参数写3是为了 让小方框看起来是嵌进去的
圆角的按钮重写paintEvent事件

QT 自定义开关效果的按钮相关推荐

  1. 【Qt】qt自定义开关控件

    基于QWidget实现一个简单的开关控件,左右动画效果切换,效果如下 样式在paintEvent中绘制 void RdSwitchButton::paintEvent(QPaintEvent *eve ...

  2. Qt自定义QPushButton

    目录 Qt自定义QPushButton 设置图标按钮 Qt自定义QPushButton 设置图标按钮 代码: m_pMinimizeButton = new QPushButton(this);m_p ...

  3. Qt 自定义(异形)形状按钮封装及实现点击弹跳效果

    文章目录 前言 效果 核心代码 mybutton.h mybutton.cpp widget.h widget.cpp 前言 Qt通过重新封装QPushButton类,实现自定义(异形)按钮,并且实现 ...

  4. Qt工作笔记-自定义开关控件

    1.自定义开关控件: 2.点击有动画效果: 3.在动画效果中,不再响应信号: 运行截图如下: 输出响应信号: 源码如下: myonoff.h #ifndef MYONOFF_H #define MYO ...

  5. WPF自定义开关切换按钮

    WPF自定义开关切换按钮 突发奇想先要自己写一个开关按钮,说干就开干了,以下为View视图布局代码,开关按钮的样式就直接在这里定义了,主要呢通过定义触发器来完成按钮的切换. ```csharp < ...

  6. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  7. QT 自定义图片按钮

    根据一位Qt博主的开源代码学习一下,顺便做个笔记. 新建一个类继承自QWidget 重写paintEvent函数把图片画出来 重写mousePressEvent处理数据点击事件,鼠标每次点击就切换按钮 ...

  8. android 高仿ios开关,Android自定义view仿IOS开关效果

    本文主要讲解如何在 Android 下实现高仿 iOS 的开关按钮,并非是在 Android 自带的 ToggleButton 上修改,而是使用 API 提供的 onDraw.onMeasure.Ca ...

  9. 【Android自定义Dialog】电视机开关效果的Dialog

    前言: 今天没有什么工作要做,就准备网上找个源码解剖下,找些干货耍耍.在DEV资源网找到了这个http://www.devstore.cn/code/info/1144.html[Android音乐播 ...

最新文章

  1. LinearAlgebra_3
  2. Oracle 表空间与数据文件
  3. 天池 在线编程 聪明的销售(计数+贪心)
  4. Tornado 高并发源码分析之六---异步编程的几种实现方式
  5. 剑灵电五服务器位置,选对服务器很重要 剑灵新手选服攻略
  6. JAVA日期查询:季度、月份、星期等时间信息
  7. python测试驱动开发 中文版_GitHub - starryrbs/python_tdd: 使用Python测试驱动开发完成Django项目...
  8. 给控件做数字签名之二:生成证书文件
  9. 如何在HTML中添加背景音乐?
  10. 使用 Nginx 服务器配置 flv、mp4,可以直接浏览器播放
  11. Python中的Counter类
  12. 如何计算离职率(1)?
  13. hellow word
  14. SONET/SDH帧格式
  15. ++a与a++、--a与a--
  16. matlab滞环比较控制器,滞环比较跟踪控制技术
  17. JetBrains PyCharm JetBrains PyCharm 2018.1.3 x64永久破解
  18. 步进电机相关基础知识及常见问题(转载)
  19. 小时候真傻,居然想着快快长大
  20. Spring面试题及答案(2021年Spring面试题大全带答案)

热门文章

  1. 在c语言中用什么表示虚线,ERWin ERStudio图里的实线和虚线的含义[转]
  2. css阴影怎么添加,css如何为div添加阴影效果
  3. 国外除了TikTok还有哪些短视频app
  4. 怎样把从CD中的cue和flac文件中提取出单曲?
  5. 我从负债十几万到财富自由
  6. PHP输出一段励志的话,最经典励志的一段话
  7. 举例说明SQL中 in和exists的区别
  8. 警惕恶性U盘病毒HDM.exe
  9. Centos7 合盖不休眠
  10. T1158 : 单词排序