1.编写自定义按钮
MyButton.h |
#ifndef #define #include /** * * */ class { Q_OBJECT public: explicit //重写MyButton的构造函数 MyButton(const //表示一个矩形 QRect //表示按钮中的文字 QString //用来表示是否按下了的布尔值 bool //表示鼠标按下的事件 void //表示鼠标释放的事件 void void signals: //信号,点击的信号 void public }; #endif |
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(); } |
鼠标按下的运行结果: 鼠标离开的运行效果: |