widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPainter>
#include <QPixmap>
#include <QPen>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//重写相关事件处理函数
void mouseMoveEvent(QMouseEvent *event) override;//鼠标移动事件
void mousePressEvent(QMouseEvent *event) override;//鼠标点击事件
void paintEvent(QPaintEvent *event) override;//绘制事件
private:
Ui::Widget *ui;
QPoint startPoint;//绘制起始点
QPixmap *pix;//膜
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("粥粥");
//实例化屏幕膜
pix=new QPixmap(this->size());//实例化一个膜大小跟当前界面一直
pix->fill(Qt::white);//使用白色进行填充
}
Widget::~Widget()
{
delete ui;
}
//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
//在该事件处理函数中 在膜上绘制一条直线
//1->实例化一个画家
QPainter p1(pix);
//2->设置画家属性
QPen pen;//准备画笔
pen.setStyle(Qt::DashDotLine);//使用虚点线
pen.setColor(QColor("green"));//设置画笔颜色
pen.setWidth(5);//设置画笔的粗细
//3->画直线
p1.drawLine(startPoint,event->pos());//起始点到鼠标当前位置绘制直线
startPoint = event->pos();//更新起始点以便于下一次绘制
//4->更新界面内容 ->绘制事件调用
this->update();
}
//鼠标点击事件
void Widget::mousePressEvent(QMouseEvent *event)
{
//获取绘制起点
startPoint = event->pos();
}
void Widget::paintEvent(QPaintEvent *event)
{
//在该事件处理函数中 将膜上面的内容绘制到界面上
//1->准备画家
QPainter p2(this);
//2->绘制
p2.drawPixmap(QPoint(0,0),*pix);
}