在QT中,QPushButton是我们经常用的控件,但是系统默认控件的样式不好看,因此我们一般都会给QPushButton设置背景图片,并且一般想达到的效果是,当鼠标放上去时是一张图片,当鼠标点击时是一张图片,当鼠标离开时,又是另外一张图片,怎么实现这个效果了。

1、setStyleSheet

setStyleSheet("QPushButton{background-image: url(:/images/1.bmp);}" "QPushButton:hover{background-image: url(:/2.bmp);}" "QPushButton:pressed{background-image: url(:/3.bmp);}");

2、自定义QPushButton
但是大家有没有遇到这样的情况,素材是几张连在一起,比如四张图片连在一起的(大多数软件图标素材),如

这种情况怎么办了,或许你会说可以用ps将上面的图片切成四个单独图片,然后用setStyleSheet,这样是可以的,但是这个方法太不方便了,也有违制作这个素材的人的初衷,那我们怎么才能利用上面素材,实现按钮背景图片的切换了?

方法是:我们可以用代码(根据位置,长宽)将上述素材分别保存为四张图片于链表中,

QPixmap pixmap(FileName);QList<QPixmap> pixmatpList;for (int cnt = 0; cnt < xnum; ++cnt){for (int y = 0; y < ynum; ++ y){pixmatpList.push_back( pixmap.copy(cnt * (pixmap.width() / xnum),y * (pixmap.height() / ynum),pixmap.width() / xnum ,pixmap.height() / ynum));}}

然后重新实现控件的paintEvent ( QPaintEvent * event),enterEvent(QEvent *event),leaveEvent(QEvent *event),mousePressEvent(QMouseEvent *event),mouseReleaseEvent(QMouseEvent *event)事件。

在实际应用中,我们可以自己定义一个Button,继承自QPushButton,然后以后使用这个自定义Button的实例。

完整代码如下:

///button.h

#ifndef CLOSEBUTTON_H
#define CLOSEBUTTON_H#include <QPushButton>
#include <QString>
#include <QWidget>class Button : public QPushButton
{Q_OBJECTQ_PROPERTY(int curIndex READ getcurIndex WRITE setcurIndex)public:   Button( QString FileName, int xnum  = 1,  QWidget *parent = 0,int ynum = 1, QString bkGrnd = NULL);Button(QVector<QString> &list, QWidget *parent = 0, QString bkGrnd = NULL);QList<QPixmap> *getPixmapList(void){return &pixmatpList;}void setcurIndex(int index){curIndex = index; update();}int getcurIndex(void){return curIndex;}private:void setPixmapList(QVector<QString> &list);QPixmap *background;protected:QList<QPixmap> pixmatpList;int curIndex;protected:virtual void paintEvent ( QPaintEvent * event);virtual void enterEvent(QEvent *event);virtual void leaveEvent ( QEvent * event );virtual void mousePressEvent ( QMouseEvent * event ) ;virtual void mouseReleaseEvent ( QMouseEvent * event );virtual  QSize sizeHint () const;};#endif // CLOSEBUTTON_H

///button.cpp

#include "button.h"
#include <QPainter>
#include <QPaintEvent>
#include <QPixmap>
#include <QLabel>
#include <QDebug>Button::Button( QString FileName, int xnum , QWidget *parent,int ynum, QString bkGrnd):QPushButton(parent)
{QPixmap pixmap(FileName);for (int cnt = 0; cnt < xnum; ++cnt){for (int y = 0; y < ynum; ++ y){pixmatpList.push_back( pixmap.copy(cnt * (pixmap.width() / xnum),y * (pixmap.height() / ynum),pixmap.width() / xnum ,pixmap.height() / ynum));}}if (bkGrnd != NULL)background  = new QPixmap(bkGrnd);elsebackground = NULL;setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed    );curIndex = 0;
}Button::Button(QVector<QString> &list, QWidget *parent,QString bkGrnd):QPushButton(parent)
{setPixmapList(list);setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);if (bkGrnd != NULL)background  = new QPixmap(bkGrnd);elsebackground = NULL;curIndex = 0;
}void Button::setPixmapList(QVector<QString> &list)
{if (list.size() <= 0) return;pixmatpList.clear();for (QVector<QString>::iterator pos = list.begin();pos != list.end(); ++pos){pixmatpList.push_back(QPixmap(*pos));}
}void Button::paintEvent ( QPaintEvent * event)
{QPainter painter(this);painter.drawPixmap(event->rect(), pixmatpList[curIndex]);
}void Button::enterEvent(QEvent *event)
{if (pixmatpList.size() > 1)curIndex = 1;elsecurIndex = 0;update();QPushButton::enterEvent(event);
}void Button::leaveEvent(QEvent *event)
{curIndex = 0;update();QPushButton::leaveEvent(event);
}void Button::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton){if (pixmatpList.size() > 2){curIndex = 2;update();}}QPushButton::mousePressEvent(event);
}void Button::mouseReleaseEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton){if (pixmatpList.size() > 1){curIndex = 1;update();}}QPushButton::mouseReleaseEvent(event);
}QSize Button::sizeHint() const
{return background != NULL? QSize(background->width(), background->height()):QSize(pixmatpList[0].width(), pixmatpList[0].height());
}

调用:

Button exitbtn=new Button(":/VanView/images/sys_button_close.png", 4, this);

效果:

QPushButton设置背景图片变换(素材四连图)相关推荐

  1. QtWidgets.QPushButton()设置背景图片

    目录 QPushButton使用setStyleSheet设置背景图片 和css一样设置setStyleSheet 转载:pyqt5实现按钮添加背景图片以及背景图片的切换 QPushButton使用s ...

  2. QT设置背景图片的三种方式

    QPalette的方法 基本步骤: (1). 首先设置QWidget的autoFillBackground属性为真 (2). 然后定义一个QPalette对象,设置QPalette对象的背景属性(颜色 ...

  3. MFC开发IM-自绘按钮控件,给按钮设置背景图片

    MFC 基础知识:对话框背景添加图片和按钮Button添加图片 很长时间没有接触MFC相关的知识了,我大概是在大二时候学习的MFC相关知识及图像处理,现在由于要帮个朋友完成个基于C++的程序,所以又回 ...

  4. 在vue中设置背景图片

    在vue中设置背景图片 在App.vue中将样式中默认的margin-top 改为0,使得页面顶部不留白 #app {font-family: 'Avenir', Helvetica, Arial, ...

  5. python窗口设置背景图片_PyQt5 实现给窗口设置背景图片的方法

    PyQt5 实现给窗口设置背景图片的方法 QPalette类可以十分简单的达到设置窗口背景图片的目的 def use_palette(self): self.setWindowTitle(" ...

  6. php图片背景平铺,css如何让背景图片平铺?css背景图片平铺四种方式介绍

    在网页设计的过程中,有时候可能会要求背景图片平铺,因为这样会让整个网页看起来比较好看,图片平铺可以不用具体设置body宽度和高度大小,就可以直接将图片平铺整个页面,那么,如何让背景图片平铺呢?接下来本 ...

  7. qt设置背景图片注意事项

    QT Create中,对button或者window等部件设置背景.颜色.透明等样式时,需要用到style sheet,可以直接在代码里写,也可以在ui设计师里通过右键change style she ...

  8. Android开发:设置背景图片

    在Android开发中,设置背景图片是一个既简单又常用的方法,由于本人现在需要同时做Android开发,所以Android的开发技能也要不断学习储备,不仅是为了给老板省钱,也是为了增加自己的竞争力.那 ...

  9. php如何平铺背景图片,css如何让背景图片平铺?css背景图片平铺四种方式介绍

    在网页设计的过程中,有时候可能会要求背景图片平铺,因为这样会让整个网页看起来比较好看,图片平铺可以不用具体设置body宽度和高度大小,就可以直接将图片平铺整个页面,那么,如何让背景图片平铺呢?接下来本 ...

  10. css 背景平铺 控制范围,css如何让背景图片平铺?css背景图片平铺四种方式介绍...

    在网页设计的过程中,有时候可能会要求背景图片平铺,因为这样会让整个网页看起来比较好看,图片平铺可以不用具体设置body宽度和高度大小,就可以直接将图片平铺整个页面,那么,如何让背景图片平铺呢?接下来本 ...

最新文章

  1. R语言使用plot函数和lines函数可视化线图(line plot)时、图之间的主要区别是由选项type产生的、type参数常用参数说明、不同type生成的可视化图像对比
  2. mysql5.7忘记root密码的修改方法
  3. 2016蓝桥杯省赛---java---C---8(冰雹数)
  4. 苹果手机的计算机删除了怎么恢复,苹果手机电话删除了怎么恢复
  5. Android快速批量打渠道包(AndroidManifestModifier)
  6. Vue项目中的文件/文件夹命名规范
  7. 用maven骨架新建项目以及解决速度慢的问题
  8. [zhuan]asp.net程序性能优化的七个方面 (c#(或vb.net)程序改进)
  9. '转载'Tableau试用过后破解失败解决方法,清除注册表工具
  10. 1-docker安装
  11. HashMap原理详解:探测技术(Probing)、数据聚集(Clustering)、寻址方式(Addressing)、墓碑删除(tombstones)等技术的深度剖析
  12. 烟雨黑帽seo超级模板站群-可一键清除内页URL转换成单页-百度搜狗超级模板站群-多城市网站站群
  13. win10重启不能上网(只能QQ上网,打不开浏览器网页)
  14. 转发:五个方向告诉你如何运营好一个公众号!
  15. 显卡T600和RTX3050哪个好
  16. 上传到服务器的网站打开是空白,网站上传服务器,首页打开空白的解决办法|74cms|骑士cms...
  17. 中国农药行业发展趋势及十四五产销需求预测报告2021-2027年版
  18. html求三角形的面积,JavaScript计算三角形面积
  19. WEB 前端面试题 (高能)
  20. 项目中如何修改element-ui的默认样式

热门文章

  1. 思科模拟器:路由器基本配置
  2. 科来网络全流量安全分析系统[Study]
  3. 科来数据包生成器找不到网卡适配器
  4. Android下实现Google街景
  5. 网页中插入视频的代码小技巧
  6. 如何做到iphone数据恢复
  7. ideapad linux s9_联想IdeaPad S9 电源管理驱动
  8. C语言三款游戏(贪吃蛇、推箱子、小鸟飞飞)(含gui)(含完整代码、粘贴即用)
  9. C#控制台应用程序的输入输出
  10. 网址导航站收录申请登陆口大全