转自:http://blog.csdn.net/starcloud_zxt/article/details/5185556

Qt自带的PushButton样式比较单一,在开发的时候往往按钮的形状各异,所以需要自定义Qt的按钮。其方法是做一张图片来作为按钮,如果需要动态效果的话,可以做两张图片进行替换。按钮的载体可以是QLabel、QPushButton,可以通过QStyle类来设计样式,如果对QStyle不太了解的话,可以用下面的方法来实现。

1. 使用QPushButton

通过自定义一个按钮样式函数,在该函数中设置按钮的样式。(可以设计一个QPushButton的子类来完成设置)

实现代码:

  1. QPushButton *custButton(QString str,QString str1)
  2. {
  3. QPushButton *pushButton= new QPushButton;
  4. pushButton->setGeometry(10,10,200,200); //按钮的位置及大小
  5. pushButton->clearMask();
  6. pushButton->setBackgroundRole( QPalette::Base);
  7. QPixmap mypixmap;   mypixmap.load(str);
  8. pushButton->setFixedSize( mypixmap.width(), mypixmap.height() );
  9. pushButton->setMask(mypixmap.createHeuristicMask());
  10. pushButton->setIcon(mypixmap);
  11. pushButton->setIconSize(QSize(mypixmap.width(),mypixmap.height()));
  12. pushButton->setToolTip(str1);
  13. return pushButton;
  14. }

调用代码:

  1. QPushButton *btn=custButton("../login.png", "LOGIN");
  2. connect(btn, SIGNAL(clicked()), this, SLOT(slotLogin()));

2. 通过QLabel

我们可以把一个图片放在QLabel里面作为按钮,因为我没有找到QLabel是否有当点击后发出的信号,所以自定义了一个鼠标事件用来检测是否在QLabel上点击了鼠标。在自定义的鼠标事件中检测QLabel所在的区域,当在该区域发生鼠标点击事件后,发送信号。

设计时通过Qt Creator在widget.ui中加入一个QLabel即可,不需要进行设置。

代码widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class Widget;
  6. }
  7. class Widget : public QWidget {
  8. Q_OBJECT
  9. public:
  10. Widget(QWidget *parent = 0);
  11. ~Widget();
  12. signals:
  13. void clicked();
  14. protected:
  15. void mousePressEvent(QMouseEvent *e);
  16. protected slots:
  17. void slotClicked();
  18. private:
  19. Ui::Widget *ui;
  20. };
  21. #endif // WIDGET_H

代码widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QMouseEvent>
  4. #include <QMessageBox>
  5. #include <QPixmap>
  6. #include <QLabel>
  7. Widget::Widget(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. //使用label作为按钮,通过自定义鼠标事件,点击label所在区域实现鼠标单击
  13. QPixmap pm;   pm.load("../logo.png");
  14. ui->label->setGeometry(0,0,pm.width(), pm.height());
  15. ui->label->setPixmap(pm);
  16. connect( this, SIGNAL(clicked()), this, SLOT(slotClicked()));   //信号连接
  17. }
  18. Widget::~Widget()
  19. {
  20. delete ui;
  21. }
  22. void Widget::mousePressEvent(QMouseEvent *e)
  23. {
  24. int x = e->x();
  25. int y = e->y();
  26. //假如在QRect( 0, 0, 48, 48 )这个区域里(图片大小为48X48),就发出信号
  27. if (x>0 && x<48 && y>0 && y<48){
  28. emit clicked();
  29. }
  30. }
  31. void Widget::slotClicked()
  32. {
  33. QMessageBox::about( this, "Mouse Example", "You have pressed mouse, exit now!");
  34. close();
  35. }

自定义Qt按钮的更多相关文章

  1. 自定义QT窗口部件外观之QStyle

    自定义QT窗口部件外观 重新定义Qt内置窗口部件的外观常用的方法有两种:一是通过子类化QStyle 类或者预定义的一个样式,例如QWindowStyle,来定制应用程序的观感:二是使用Qt样式表. Q ...

  2. Mono自定义图片按钮

    首先,我们编写一个MyImageButton类,继承自LinearLayout public class MyPhoneImageButton:LinearLayout { private Image ...

  3. android自定义控件(3)-自定义当前按钮属性

    那么还是针对我们之前写的自定义控件:开关按钮为例来说,在之前的基础上,我们来看看有哪些属性是可以自定义的:按钮的背景图片,按钮的滑块图片,和按钮的状态(是开还是关),实际上都应该是可以在xml文件中直 ...

  4. iOS 自定义返回按钮,保留系统滑动返回

    原文链接 自定义返回按钮保留系统滑动返回手势.gif 1.简介 使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使 ...

  5. easyUI——datebox验证和自定义取消按钮

    来源:http://blog.csdn.net/liusong0605/article/details/42270463 1. datebox验证        验证结束时间<起始时间: 起始时 ...

  6. iOS 7 自定义Back按钮 与 Pop interactive gesture 问题

    1.自定义Back按钮 iOS中很多时候我们都会自定义返回按钮,也是一件easy的事,类似如下: // 返回按钮 1 - (void)showNavBackButton { UIButton *bac ...

  7. Android 自定义Button按钮显示样式(正常、按下、获取焦点)

    现在的用户对APP的外观看得很重要,如果APP内所有元件都用Android默认样式写,估计下面评论里就有一堆在骂UI丑的.今天学习自定义Button按钮样式.Button样式修改的是Button的背景 ...

  8. GridView控件中插入自定义删除按钮并弹出确认框

    GridView控件中插入自定义删除按钮,要实现这个功能其实有多种方法,这里先记下我使用的方法,以后再添加其他方法. 一.实现步骤 1.在GridView中添加模板列(TemplateField). ...

  9. ArcGIS API for JavaScript 4.2学习笔记[16] 弹窗自定义功能按钮及为要素自定义按钮(第五章完结)

    这节对Popups这一章的最后两个例子进行介绍和解析. 第一个[Popup Actions]介绍了弹窗中如何自定义工具按钮(名为actions),以PopupTemplate+FeatureLayer ...

随机推荐

  1. iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)

    iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath 首先分析有几种原因,以及相应的解决方法 1.UITableViewCell的userInterac ...

  2. STL——空间配置器(构造和析构基本工具)

    以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...

  3. win32 api 文件操作!

    CreateFile打开文件要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门. ReadFile从文件中读取字节信息.在打开文件获得了文件句柄之后, ...

  4. javascript 鼠標拖動功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. [转] JAVA的Random类

    Random类 (java.util) Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要 ...

  6. Java中如何分析一个案列---猫狗案例为例

    猫狗案例: 具体事务: 猫.狗 共性: 姓名.年龄.吃饭 分析:从具体到抽象 猫: 姓名.年龄--->成员变量 吃饭       ---> 成员方法 构造方法:无参.有参 狗: 姓名.年龄 ...

  7. Linux磁盘管理:lvcreate 常用命令

    查看当前LV及PV信息: [root@rusky ~]# hostnamectl Static hostname: localhost.localdomain Transient hostname: ...

  8. Poj 3368 Frequent values

    /* 线段树区间合并 维护几个信息 到时候乱搞一下就好了 开始T了 有一种情况可以不用递归 直接算出来 */ #include<iostream> #include<cstdio&g ...

  9. .NET使用js验证服务器控件

    <asp:TextBox ID="txtName" runat="server" Width="150px" CssClass=&qu ...

  10. CSS入门学习(转)

    一.基础学习 1.何为CSS CSS是Cascading Style Sheets(层叠样式表)的简称,是一种标记语言,它不需要编译,可以直接由浏览器执行(属于浏览器解释型语 言). CSS文件也可以 ...