5.Qt自定义Button按钮的实现



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
= 0);

   
//重写MyButton的构造函数

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

 

   
//表示一个矩形

   
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 = 0);
    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();
}

鼠标按下的运行结果:

鼠标离开的运行效果:

 

 

时间: 2024-09-21 19:07:46

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

关于自定义Web服务器控件如何获取当前点击的button按钮

问题描述 关于自定义Web服务器控件如何获取当前点击的button按钮的所有的值

Android 自定义Button控件实现按钮点击变色_Android

效果图如下所示: 一.shape 样式:(在drawable新建-->new-->Drawable resource file 在父级标签selector添加Item ) <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item and

iOS自定义button抖动效果并实现右上角删除按钮_IOS

遇到过这种需求要做成类似与苹果删除软件时的动态效果. 1.长按抖动; 2.抖动时出现一个X; 3.点击x,删除button; 4.抖动时,点击按钮,停止抖动; 下面是我的设计思路: 1.继承UIButton: 2.给button在右上角添加一个按钮: 3.给button添加长按手势: 4.给button添加遮盖,抖动时可以拦截点击事件: 有更好的做法,还请斧正. // .m文件 #import "DZDeleteButton.h" #import "UIView+Extens

Android 自定义Button控件实现按钮点击变色

效果图如下所示: 一.shape 样式:(在drawable新建-->new-->Drawable resource file 在父级标签selector添加Item ) <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item and

自定义按钮按键-MFC 多文档 视图程序 打印预览 添加自定义button按钮按键

问题描述 MFC 多文档 视图程序 打印预览 添加自定义button按钮按键 想在多文档视图程序的打印预览中添加自定义的按钮,比如导出到文件按钮. 百度google,好像改afxprint.rc文件可以实现,但我修改后保存不了,提示cannot save. 不知道怎么弄了,这问题搞了一天了,不知道有没有可以告诉下的,谢谢了.

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

前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调,Block回调.具体的内容请参考之前的博客:"Objective-C中的Block回调模式","Target-Action回调模式","Objective-C中的委托(代理)模式".在接下来要封装的button中将要用到上面的知识点.之前在做新浪微

Cocos2D-X入门(16)几种常用的 CCMenuItem、自定义Button

几种常用的菜单项: //字体菜单项 CCMenuItemFont* itemFont = CCMenuItemFont::create("开始游戏", this, menu_selector(HelloWorld::onMenu)); //图片菜单项 CCMenuItemImage* itemImage = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png", this,

uibutton-点击自定义的按钮应用就会中止

问题描述 点击自定义的按钮应用就会中止 创建了导航条的自定义按钮,点击时,会中止: -(void)viewDidLoad{ UIImage *backButtonImage = [UIImage imageNamed:@""button.png""]; UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; [backButton setImage:backButtonImage fo

android-Android自定义Button的OnKeyDown方法没反应

问题描述 Android自定义Button的OnKeyDown方法没反应 代码如下: 自定义Button类 public class MyButton extends Button{ public MyButton(Context context,AttributeSet set) { super(context,set); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(ke