first: 一条线
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<QPoint> _lines //记录画过的东西
signals:
public slots:
void slotButtonClicked();
};
#endif // MYWIDGET_H
MyWidget.cpp
#include "mywidgets.h"
#include<QApplication>
#include<QMouseEvent>
#include<QPainter>
MyWidgets::MyWidgets(QWidget *parent) : QWidget(parent)
{
}
void MyWidgets::paintEvent(QPaintEvent *) //调用:1 窗口初始化 2update 3 系统认为重绘时
{
QPainter p(this);
for(int i=0; i<_line.size()-1;i++)
{
p.drawLine(_line.at(i),_line.at(i++));
}
}
void MyWidgets::mousePressEvent(QMouseEvent *ev)
{
_line.append(ev->pos());
}
void MyWidgets::mouseMoveEvent(QMouseEvent *e)
{
_line.append(e->pos());
<pre name="code" class="cpp" style="color: rgb(255, 0, 0);"> update();
}void MyWidgets::mouseReleaseEvent(QMouseEvent *e){ _line.append(e->pos());}int main(int argc , char** argv){ QApplication app(argc, argv); MyWidgets w; w.show(); app.exec();}
second:画板
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);
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 "mywidgets.h"
#include<QApplication>
#include<QMouseEvent>
#include<QPainter>
MyWidgets::MyWidgets(QWidget *parent) : QWidget(parent)
{
}
void MyWidgets::paintEvent(QPaintEvent *) //调用:1 窗口初始化 2update 3 系统认为重绘时
{
QPainter p(this);
for(int i=0; i<_lines.size();i++)
{
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 MyWidgets::mousePressEvent(QMouseEvent *ev)
{
QVector<QPoint> line;
_lines.append(line);
_lines.last().append(ev->pos());
}
void MyWidgets::mouseMoveEvent(QMouseEvent *e)
{
_lines.last().append(e->pos());
update();
}
void MyWidgets::mouseReleaseEvent(QMouseEvent *e)
{
_lines.last().append(e->pos());
}
int main(int argc , char** argv)
{
QApplication app(argc, argv);
MyWidgets w;
w.show();
app.exec();
}
three 画一个button
MyButton.h
#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; //biaoji
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
signals:
void clicked();
public slots:
};
#endif // MYBUTTON_H
MyButton.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 *)
{
_pressed = true;
update();
}
void MyButton::mouseReleaseEvent(QMouseEvent *ev)
{
_pressed = false;
update();
if(_rect.contains(ev->pos())) //鼠标在Button中才算 clicked
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>
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 *) ////调用:1 窗口初始化 2update 3 系统认为重绘时
{
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();
}