Qt 自定义PushButton
http://blog.csdn.net/zddblog/article/details/11116191
功能:鼠标弹起并在按键区域内时,按键响应。并实现normal、hover、pressed效果,PushButton大小默认为传入图片大小。
PushButton的normal、hover、pressed效果没有使用QSS实现,因为重写mouseReleaseEvent后,qss的hover效果混乱。
用法:
- loginButton = new PushButton(":/button/login_button_normal",
- ":/button/login_button_hover",
- ":/button/login_button_pressed");
loginButton = new PushButton(":/button/login_button_normal",
":/button/login_button_hover",
":/button/login_button_pressed");
或者:
- loginButton = new PushButton(":/button/login_button");
loginButton = new PushButton(":/button/login_button");
效果:
具体实现:
- #include "pushbutton.h"
- #include <QPainter>
- #include <QMouseEvent>
- #include <QFontMetrics>
- #include <QLabel>
- PushButton::PushButton(QString normal, QString hover, QString pressed, QWidget *parent) :
- QPushButton(parent)
- {
- buttonState = Normal;
- normalPixmap.load(normal);
- hoverPixmap.load(hover);
- pressPixmap.load(pressed);
- this->setFixedSize(normalPixmap.size());
- this->setContentsMargins(0, 0, 0, 0);
- }
- PushButton::PushButton(QString background, QWidget *parent) :
- QPushButton(parent)
- {
- buttonState = Normal;
- normalPixmap.load(background);
- hoverPixmap.load(background);
- pressPixmap.load(background);
- this->setFixedSize(normalPixmap.size());
- this->setContentsMargins(0, 0, 0, 0);
- }
- void PushButton::paintEvent(QPaintEvent *)
- {
- QPainter painter(this);
- switch(buttonState)
- {
- case Normal:
- painter.drawPixmap(this->rect(), normalPixmap);
- break;
- case Hover:
- painter.drawPixmap(this->rect(), hoverPixmap);
- break;
- case Pressed:
- painter.drawPixmap(this->rect(), pressPixmap);
- }
- painter.drawText(this->rect(), Qt::AlignCenter, this->text());
- }
- void PushButton::enterEvent(QEvent *)
- {
- buttonState = Hover;
- update();
- }
- void PushButton::leaveEvent(QEvent *)
- {
- buttonState = Normal;
- update();
- }
- void PushButton::mousePressEvent(QMouseEvent *e)
- {
- if(e->button() == Qt::LeftButton)
- {
- buttonState = Pressed;
- update();
- }
- }
- bool isOnPushButton(const QPoint &point, const PushButton *pushButton)
- {
- if(point.x() < 0 || point.x() > pushButton->width() ||
- point.y() < 0 || point.y() > pushButton->height())
- {
- return false;
- }
- return true;
- }
- void PushButton::mouseReleaseEvent(QMouseEvent *e)
- {
- if(e->button() == Qt::LeftButton)
- {
- //判断鼠标抬起时是否在PushButton之上
- if(isOnPushButton(e->pos(), this))
- {
- emit clicked();
- }
- buttonState = Hover;
- update();
- }
- }
Qt 自定义PushButton的更多相关文章
- Qt自定义插件编程小结
qt自定义组件开发步骤演示.以下所有步骤的前提是自己先编译Qtcreator源码,最好生成release版的QtCreator,否则自定义的插件嵌入QtCreator会失败!!!(这个网上教程很多) ...
- paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制
源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: ...
- QSet使用及Qt自定义类型使用QHash等算法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSet使用及Qt自定义类型使用QHash等算法 本文地址:http://techie ...
- Qt自定义标题栏
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt自定义标题栏 本文地址:http://techieliang.com/2017/1 ...
- Qt 自定义事件(三种方法:继承QEvent,然后Send Post就都可以了,也可以覆盖customEvent函数,也可覆盖event()函数)
Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...
- Qt中PushButton的pressed,released,clicked三种响应的区别
Qt的PushButton的常用的三种响应有pressed,released和clicked. 优先级:pressed>released>clicked 按下按钮pressed函数的内容, ...
- Qt 自定义事件
Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...
- qt 中的自定义pushbutton
- Qt自定义窗口部件
QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin) 改进法 1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...
随机推荐
- poj 1717==洛谷P1282 多米诺骨牌
Dominoes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6571 Accepted: 2178 Descript ...
- idea 右下角不显示git分支
开发工程中遇到idea右下角不显示git分支问题: 解决方案:查找资料说是需要打开VCS->Enable version control. 但是Enable version control 已经 ...
- 阻塞(sleep等等)区别 中断(interrupt)+ 中断的意义
不客气地说,至少有一半人认为,线程的"中断"就是让线程停止.如果你也这么认为,那你对多线程编程还没有入门. 在java中,线程的中断(interrupt)只是改变了线程的中断状态, ...
- echarts, 小知识点随意记录,
注意点: 写echarts代码时,注意格式,每个项的子项用‘,‘分隔,最后一项不需要.如符号不也会造成图形显示不出来.写时注意参照配置项. 如下orient的属性需要单引号,每个项需要逗号等. leg ...
- Go语言的一些问题
1.go 运行错误expected 'package', found 'EOF'解决? 只要将文件保存一下,再运行就ok了. 2.问题如下: D:\goprojects>go buildcan' ...
- passback_params 支付回调的 原样返回字段 自定义字段的存放字段
开放平台文档中心 https://docs.open.alipay.com/204/105465/ passback_params String 否 512 公用回传参数,如果请求时传递了该参数,则返 ...
- HTML代码的美感
每当我访问精美的网站,我都情不自禁地会去查看源代码.这就好比你拥有一副X光眼镜,能够看到任何人--甚至透视他们的遮羞布.这简直是天经地义的事情嘛!我迫不及待地想了解,这个精美的网站,是不是由同样具有美 ...
- Python基础-常用的内置函数
内置函数filter str = ['a', 'b', 'c', 'd'] def fansik(num): if num != "a": return num ret = fil ...
- 3.7 基于51单片机+MC20的路径显示【使用STC15W内核】
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- 0607pm克隆&引用类&加载类&面向对象串讲&函数重载
克隆class Ren{ public $name; public $sex; function __construct($n,$s) { $this->name=$n; $this->s ...