//!
//! 随笔:Qt变色图像三态按钮
//!
//! == 控件简介 ==
//! 本次提供继承QWidget的按钮控件,提供显示图片功能,
//!     可根据图片透明度设置前景色和后景色,可添加边框和设置保持进入状态颜色,
//!     提供sn_clicked信号(鼠标抬起时发出)
//! == 控件简介 ==
//!
//! 结束语:
//!     文章后提供qbutt_col.h和qbutt_col.cpp文件
//!
#include "../qbutt_col.h"
#include "widget.h"
#include <iostream>
#include <QApplication>using namespace std;int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();qbutt_col bu1(&w);bu1.set_pic("/home/red/open/github/qt_hur/pic/m_one/m_2.png");bu1.set_col_foreground({0x808080,0x101010,0xff0000});  //前景色bu1.set_col_background({0xffaa44,0xff0000,0xffff00});  //背景色bu1.set_frame(true,QPen(QColor(0x010000),6));          //设置边框(宽度设置偶数可居中)bu1.show();w.connect(&bu1,&qbutt_col::sn_clicked,&w,[](){cout<<"sn_clicked"<<endl;});qbutt_col bu2(&w);bu2.move(bu1.width()+10,0);bu2.set_pic("/home/red/open/github/qt_hur/pic/m_one/m_2.png",100,200);bu2.set_col_foreground({0x808080,0x101010,0xff0000});  //前景色bu2.set_col_background({0xffaa44,0xff0000,0xffff00});  //背景色bu2.set_frame(true,QPen(QColor(0x010000),6));          //设置边框(宽度设置偶数可居中)bu2.set_keep_col(true); //保持进入颜色bu2.show();w.connect(&bu2,&qbutt_col::sn_clicked,&w,[](){cout<<"sn_clicked"<<endl;});return a.exec();
}
//!
//! qbutt_col.h
//!
#ifndef QBUTT_COL_H
#define QBUTT_COL_H#include <QWidget>
#include <QPainter>
#include <QWidget>
#include <QMouseEvent>//!
//! 功能:图片变色三态按钮
//! 用法:传入一张PNG图片(推荐黑白图片),传入三态RGB颜色,触发三态时根据RGB颜色改变图片颜色
//! 原理:保留PNG图片每个点位的颜色信息和透明度,如果点为不透明,根据三态RGB颜色改变点为颜色
//! 注意:前景指有颜色的像素点,背景指透明的像素点
//!
class qbutt_col : public QWidget
{Q_OBJECT
public:struct status{QColor normal;QColor enter;QColor press;};public:explicit qbutt_col(QWidget *parent = nullptr);bool set_pic(QString pic,int w = 0,int h = 0);  //设置图片void set_col_foreground(status col);            //设置前景变化颜色void set_col_background(status col);            //设置背景变化颜色void set_keep_col(bool keep);                   //保持进入状态颜色void set_frame(bool frame,QPen pen);            //保持进入状态颜色 (QPen-width双倍数值可居中)signals:emit void sn_clicked();protected://绘图事件void paintEvent(QPaintEvent *event) override;//触发事件void enterEvent(QEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void leaveEvent(QEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;//改变像素点颜色void ch_col_point(QColor col_fore,QColor col_back);private:bool _keep_col = false;     //保存进入颜色bool _load_pic = false;     //加载图片bool _paint_frame = false;  //边框bool _paint_fore = false;   //前景bool _paint_back = false;   //背景status _fore;       //前景status _back;       //背景QPen _pen_frame;    //边框颜色QPixmap _pix;       //显示图片QVector<QVector<int>> _vec_alpha;   //记录像素点透明度
};#endif // QBUTT_COL_H
//!
//! qbutt_col.cpp
//!
#include "qbutt_col.h"qbutt_col::qbutt_col(QWidget *parent) : QWidget(parent)
{}bool qbutt_col::set_pic(QString pic,int w,int h)
{_load_pic = _pix.load(pic);if(_load_pic){//载入图片,保存透明度像素点if(w != 0 || h != 0) _pix = _pix.scaled(w,h); //设置缩放QImage img = _pix.toImage();_vec_alpha.resize(img.width());for(int w=0;w<img.width();w++){_vec_alpha[w].resize(img.height());for(int h=0;h<img.height();h++){_vec_alpha[w][h] = img.pixelColor(w, h).alpha();}}this->resize(img.size()); //重置大小到图片尺寸}return _load_pic;
}void qbutt_col::set_col_foreground(status col)
{_paint_fore = true;_fore = col;ch_col_point(_fore.normal,_back.normal);
}void qbutt_col::set_col_background(status col)
{_paint_back = true;_back = col;ch_col_point(_fore.normal,_back.normal);
}void qbutt_col::set_keep_col(bool keep)
{_keep_col = keep;
}void qbutt_col::set_frame(bool frame,QPen pen)
{_paint_frame = frame;_pen_frame = pen;
}void qbutt_col::paintEvent(QPaintEvent *event)
{if(_load_pic){QPainter *show = new QPainter(this);show->drawPixmap(0,0,_pix);if(_paint_frame){show->setPen(_pen_frame);show->drawRect(this->rect());}show->end();}else QWidget::paintEvent(event);
}void qbutt_col::enterEvent(QEvent *event)
{ch_col_point(_fore.enter,_back.enter);QWidget::enterEvent(event);
}void qbutt_col::mousePressEvent(QMouseEvent *event)
{ch_col_point(_fore.press,_back.press);QWidget::mousePressEvent(event);
}void qbutt_col::leaveEvent(QEvent *event)
{if(_keep_col == false) { ch_col_point(_fore.normal,_back.normal); }QWidget::leaveEvent(event);
}void qbutt_col::mouseReleaseEvent(QMouseEvent *event)
{if(this->rect().contains(event->pos())) { emit sn_clicked(); }ch_col_point(_fore.enter,_back.enter);QWidget::mouseReleaseEvent(event);
}void qbutt_col::ch_col_point(QColor col_fore,QColor col_back)
{if(_paint_fore == false) return;QImage img = _pix.toImage(); //载入for (int w=0;w<img.width();w++){for (int h=0;h<img.height();h++){if(_vec_alpha[w][h] > 0 && _paint_fore){col_fore.setAlpha(_vec_alpha[w][h]);img.setPixelColor(w,h,col_fore);}else if(_paint_back) { img.setPixelColor(w,h,col_back); }}}_pix = QPixmap::fromImage(img); //保存this->update();
}

== 测试图片 ==

随笔:Qt变色图像三态按钮相关推荐

  1. 【WPF】使用 XAML 的 Trigger 系统实现三态按钮

    利用 WPF 的 Trigger 系统,也可以很简单的只使用xmal实现三态按钮.在Window或UserControl的资源中声明按钮的style并加入触发功能.使用的时候直接在button里复写s ...

  2. java怎样调用图像做按钮_swing-Java:使用图像作为按钮

    swing-Java:使用图像作为按钮 我想将图像用作Java中的按钮,而我尝试这样做: BufferedImage buttonIcon = ImageIO.read(new File(" ...

  3. Qt中如何给按钮加图标(背景图片)

    Qt中如何给按钮加图标(背景图片) 1. Qt Designer中拖入一Tool Button 2. 选择图标的图片放入工程目录下,如放在Resources内 3. 双击工程的Resource Fil ...

  4. Qt|QToolBtton实现三态图标及文字变化

    效果: 第一种方法使用原生QToolButton的stylesheet实现,优点很明显代码量少,也可灵活修改. // 设置样式.背景图,置顶,居中,无伸缩:字体大小:上面空出36px给图片: QStr ...

  5. QT:点击按钮实现不同的图像操作代码

    qttest.h文件 #ifndef QTTEST_H #define QTTEST_H#include <QtGui/QMainWindow> #include "ui_qtt ...

  6. (QT)qss与按钮

    一.qss 1.qss相关概念 QT QSS(Qt Style Sheets)文件是一种基于CSS的样式表语言,用于定义QT应用程序的外观和风格.它可以用于控制应用程序中的各种界面元素的外观和行为,如 ...

  7. 【Qt】QMainWindow最大化按钮是灰色(不能最大化)的解决方法

    解决方法 设置最大尺寸为16777215,并且使能Qt::WindowMaximizeButtonHint(默认就是使能的,不执行也可以) const QSize MAIN_SIZE_MAX = QS ...

  8. php图标按钮,CSS如何创建图像图标按钮(附代码)

    本篇文章给大家分享如何用CSS创建一个带有图像图标的按钮,内容很详细,有感兴趣的朋友可以看一看. 在按钮表面上显示图像图标时,请写代码以在按钮标签中显示图像,实现此效果要使用显示设置为内联块的span ...

  9. Qt控件与按钮颜色透明

    QT设置按钮控件透明: 代码://设置按钮 背景 前景 this->ui->ShowCvRGB->setStyleSheet(QString("color:rgba(255 ...

最新文章

  1. 小米miui系统怎么关闭文件管理里的热门视频和表情?
  2. 回顾2018,正在改变未来游戏规则的技术
  3. GCC对C++标准的实现情况
  4. 【大会】QoE也能驱动业务创新
  5. ASP.NET Core中为指定类添加WebApi服务功能
  6. mysql怎么访问用户B_MySQL访问控制和用户管理
  7. DynamipsGUI下CISCO SDM的安装配置
  8. CSS3详解:transform、transition
  9. 斗拱展开面积表_144996_河南省仿古建筑工程计价综合单价2009
  10. 两台计算机怎样共享一台打印机共享文件夹,两台电脑怎么共享文件和打印机
  11. jhu研究生录取 计算机,成绩一般被JHU信息系统管理MIS硕士录取
  12. URLConnection类
  13. 气象数据产品下载网址汇总
  14. MySQL 索引原理
  15. 基于OMNET++仿真平台的4维超立方体网络仿真
  16. 华为手机设置 网页打不开java_如何设置华为手机浏览器,打开后不会自动跳转......
  17. 给定一个递增序列,a1 a2 ...an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤in),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小...
  18. 1483. 纪念品分组 输出好忧桑…………
  19. GIC/ITS代码分析(1)MADT表
  20. (离散数学)用谓词逻辑推理的方法证明下面推理的有效性。要求按照推理的格式书写推理过程

热门文章

  1. 小李飞刀:python老师我今天没有灵感起名字了
  2. java计算机毕业设计工厂生产计划与进度管理系统MyBatis+系统+LW文档+源码+调试部署
  3. cool-admin框架使用
  4. python写透视挂_opencv+python 透视变换
  5. Spring MVC注解、标签库、国际化
  6. android默认exported_Android activity exported属性理解
  7. 从百度信誉评级看未来网络优化的方向
  8. 外观专利申请流程是怎样的?
  9. wow dz如何pk zs
  10. rpm包常用命令指南