1.编写自定义按钮

MyButton.h

#ifndef
MYBUTTON_H

#define
MYBUTTON_H

#include
<QWidget>

/**

*
@brief
The
MyButton
class

*
如果想重写button,需要继承QWidget

*/

class
MyButton
:
public
QWidget

{

Q_OBJECT

public:

explicit
MyButton(QWidget
*parent
);

//重写MyButton的构造函数

MyButton(const
QString&
text,
QWidget*
parent =
);

//表示一个矩形

QRect
_rect;

//表示按钮中的文字

QString
_text;

//用来表示是否按下了的布尔值

bool
_pressed;

//表示鼠标按下的事件

void
mousePressEvent(QMouseEvent
*);

//表示鼠标释放的事件

void
mouseReleaseEvent(QMouseEvent
*);

void
paintEvent(QPaintEvent
*);

signals:

//信号,点击的信号

void
clicked();

public
slots:

};

#endif
//
MYBUTTON_H

MyButtonn.cpp

#include "MyButton.h"
#include <QPainter>
#include <QMouseEvent>
 
MyButton::MyButton(QWidget *parent) :
    QWidget(parent), _rect(0, 0, 100, 30), _text(QString())
{
    //通过这个标记按钮是否被按下了
    _pressed = false;
    this->setGeometry(_rect);
}
 
MyButton::MyButton(const QString &text, QWidget *parent):
    QWidget(parent),_text(text),_rect(0,0,100,30)
{
    _pressed = false;
    this->setGeometry(_rect);
}
 
void MyButton::mousePressEvent(QMouseEvent *ev)
{
    _pressed = true;
    update();
}
 
void MyButton::mouseReleaseEvent(QMouseEvent *ev)
{
    _pressed = false;
    update();
 
    if(_rect.contains(ev->pos()))
        emit clicked();
    // callback handler
}
 
void MyButton::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    if(_pressed)
        //如果是按下的,则显示的是黄色的
        p.setBrush(Qt::yellow);
    else
        //如果没有被按下了,回复称灰色的
        p.setBrush(Qt::darkGray);
    p.drawRect(_rect);
    p.drawText(_rect,_text,QTextOption(Qt::AlignCenter));
}

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include "MyButton.h"
 
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent);
    MyButton* button;
 
    void paintEvent(QPaintEvent *);
 
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
 
    QVector< QVector<QPoint> > _lines;
signals:
 
public slots:
    void slotButtonClicked();
};
 
#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"
#include <QPainter>
#include <QPixmap>
#include <QMouseEvent>
#include <QDebug>
#include <QApplication>
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    button = new MyButton("MyButton", this);
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
 
    button->setGeometry(30, 30, 100, 30);
}
 
//槽函数
void MyWidget::slotButtonClicked()
{
    qDebug() << "button is clicked";
}
 
void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    //通过下面的方式实现画多条线
    for(int i = 0; i < _lines.size();++i)
    {
        const QVector<QPoint> & line = _lines.at(i);
        for(int j = 0; j < line.size() - 1;++j)
        {
            p.drawLine(line.at(j),line.at(j + 1));
        }
    }
}
 
/**
 * @brief MyWidget::mouseMoveEvent 鼠标移动的事件
 * @param ev
 */
void MyWidget::mouseMoveEvent(QMouseEvent *ev)
{
    if(_lines.size() == 0)
    {
        QVector<QPoint> line;
        _lines.append(line);
    }
 
    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
 
    update();
}
 
void MyWidget::mousePressEvent(QMouseEvent *ev)
{
    QVector<QPoint> line;
    _lines.append(line);
 
    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
}
 
void MyWidget::mouseReleaseEvent(QMouseEvent *ev)
{
    QVector<QPoint>& lastLine = _lines.last();
    lastLine.append(ev->pos());
}
 
int main(int argc,char** argv)
{
    QApplication app(argc,argv);
 
    MyWidget w;
    w.show();
 
    return app.exec();
}

鼠标按下的运行结果:

鼠标离开的运行效果:

5.Qt自定义Button按钮的实现的更多相关文章

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

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

  2. C#自定义Button按钮控件

    C#自定义Button按钮控件 在实际项目开发中经常可以遇到.net自带控件并不一定可以满足需要,因此需要自定义开发一些新的控件,自定义控件的办法也有多种,可以自己绘制线条颜色图形等进行重绘,也可以采 ...

  3. Qt自定义标签按钮

    当你接触到Qt时,你会为它极为方便的跨平台方面感到吃惊,从而想尝试着使用Qt.渐渐地你会发现Qt自带的一些控件不能满足自己的需要,此时就需要我们自己定义一个属于自己的控件.总所周知,标签的风格设置类比 ...

  4. Android自定义Button按钮显示样式

    关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法. 首先android的selector是在 ...

  5. wpf 自定义Button按钮

    创建ButtonEx类 public class ButtonEx : Button { static ButtonEx() { DefaultStyleKeyProperty.OverrideMet ...

  6. 制作自定义背景Button按钮、自定义形状Button的全攻略(转)

    在Android开发应用中,默认的Button是由系统渲染和管理大小的.而我们看到的成功的移动应用,都是有着酷炫的外观和使用体验的.因此,我们在开发产品的时候,需要对默认按钮进行美化.在本篇里,笔者结 ...

  7. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  8. 如何在MFC界面开发中响应Button按钮的Down和Up事件

    通过尝试有两种方案可以解决这个问题,第一种方案是通过PreTranslateMessage函数在调度消息之前对消息类型进行筛选,第二种方案是重载CButton类,在重载后的类CForTestButto ...

  9. iOS_Swift初识之使用三种回调方式自定义Button

    最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式)  很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理 ...

随机推荐

  1. [Apio2009]Atm

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  2. 51nod 1376 最长递增子序列的数量(线段树)

    51nod 1376 最长递增子序列的数量 数组A包含N个整数(可能包含相同的值).设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递 ...

  3. bzoj 3631: [JLOI2014]松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

  4. Linux学习之CentOS(十一)-----Linux 账号管理(转)

    Linux 账号管理(转) useraddpasswdchageusermoduserdelfingerchfnchshidgroupaddgroupmodgroupdelgpasswd su(帐号切 ...

  5. JVM回收方法区内存

    很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是 ...

  6. log4j不生成日志文件的问题

    直接看我的注解吧 注意地址的斜杠,还有地址别写什么相对地址了,这包太老了,服务器update一下兼容问题就出来了. #第一个参数定义达到什么程度就输出 第二第三....第N 定义输出的类型 #debu ...

  7. ExecutorService

    接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行.壹個 ExecutorService 实例因此特别像壹個线程池.事实上, ...

  8. Linux下SonarQube代码质量平台的安装和使用方法

    Sonar简介: Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量 通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,Java ...

  9. 微信小程序 发现之旅(一)—— 项目搭建与页面跳转

    开发微信小程序需要注册一个小程序账号,具体流程可以参照官方教程: https://mp.weixin.qq.com/debug/wxadoc/dev/index.html 开通账户之后,在 “开发设置 ...

  10. truncated、delete和drop的异同点

    相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据. 不同点: 1.truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结 ...