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按钮的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银行从业资格考试零基础怎么通过?技巧有哪
- 下一篇: 6.QT信号和槽