日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/27 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(); }

鼠標按下的運行結果:

鼠標離開的運行效果:

?

?

總結

以上是生活随笔為你收集整理的5.Qt自定义Button按钮的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。