本例实现2个功能:1)画多条线 2)自定义按钮
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QWidget>
class MyButton : public QWidget
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = 0);
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
#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 *)
{
_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));
}
#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
#include "MyWidget.h"
#include <QPainter>
#include <QPixmap>
#include <QMouseEvent>
#include <QDebug>
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));
}
}
}
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());
}
#include <QApplication>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
MyWidget w;
w.show();
return app.exec();
}