C语言
主页 > 软件编程 > C语言 >

Qt实现画笔功能的介绍

2022-08-20 | 佚名 | 点击:

用Qt实现在窗口上画线,类似于画笔功能。

头文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#ifndef MyPaint_h__

#define MyPaint_h__

 

#include <QtWidgets/QWidget>

 

class MyPaint :public QWidget

{

    Q_OBJECT

public:

    MyPaint(QWidget *parent = nullptr);

 

    void mousePressEvent(QMouseEvent *event);

    void mouseMoveEvent(QMouseEvent *event);

    void mouseReleaseEvent(QMouseEvent *event);

    void paintEvent(QPaintEvent *event);

 

private:

    std::vector<std::vector<QPoint>> _lines;

 

};

 

#endif // MyPaint_h__

实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

#include "MyPaint.h"

#include <QPainter>

#include <QMouseEvent>

 

 

MyPaint::MyPaint(QWidget *parent):QWidget(parent)

{

 

}

 

void MyPaint::mousePressEvent(QMouseEvent *event) //鼠标按下的时候新增加一条线,并记录起点

{

    std::vector<QPoint> line;  

    line.push_back(event->pos());

    _lines.push_back(line);

}

 

void MyPaint::mouseMoveEvent(QMouseEvent *event)//鼠标移动的时候新增加点

{

    auto &line = _lines[_lines.size() - 1];

    line.push_back(event->pos());

 

    update(); //更新,重新绘制窗口,自动调用paintEvent

}

 

void MyPaint::mouseReleaseEvent(QMouseEvent *event)

{

    auto &line = _lines[_lines.size() - 1];

    line.push_back(event->pos());

}

 

void MyPaint::paintEvent(QPaintEvent *event) //绘制所有的线

{

    //QPainter painter(this);

    //painter.setPen(QPen(Qt::red, 3, Qt::DashLine));

    //painter.setBrush(Qt::blue);

    //painter.drawRect(QRect(10, 10, 100, 30));

    //painter.drawEllipse(130, 10, 50, 50);

    //painter.drawLine(QLine(200, 10, 300, 20));

    //painter.drawText(QPoint(10, 70), "hello" );

    QPainter painter(this);

    painter.setPen(QPen(Qt::green, 3));

    for (const auto &line : _lines)

    {

        for (int i=0;i<line.size()-1;i++)

        {

            painter.drawLine(line.at(i), line.at(i + 1));

        }

    }

}

效果

原文链接:https://blog.csdn.net/geduo_feng/article/details/102999980
相关文章
最新更新