QT学习一之画板制作(解决绘画卡顿)

匿名 (未验证) 提交于 2019-12-03 00:22:01


)擦除。


  1. 创建画板界面
  2. 鼠标拖动模拟画笔
  3. 右键擦除所有绘画


class VDCSketchpadWidget : public QWidget {
    Q_OBJECT
public:
    explicit VDCSketchpadWidget(QWidget *parent = 0);
    ~VDCSketchpadWidget();
private:
    void paintEvent(QPaintEvent *event);
private:
    Ui::VDCSketchpadWidget *ui;
    
};

setWindowFlags(Qt::BypassWindowManagerHint|Qt::Drawer);//全无边框;画板     setWindowState(Qt::WindowFullScreen);   //全屏

2.实现鼠标拖动模拟画笔

现附上代码

class VDCSketchpadWidget : public QWidget {
    Q_OBJECT
public:
    explicit VDCSketchpadWidget(QWidget *parent = 0);
    ~VDCSketchpadWidget();
private:
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void drawBackGround(QPainter&);         //绘制背景
    void drawUserDraw(QPainter&);           //用户绘制
private:
    Ui::VDCSketchpadWidget *ui;
    QVector<QLineF> m_lineFList;
    QPointF m_startPointF;
    QPointF m_endPointF;
    bool m_bValidDraw;  //有效绘画
    bool m_bStart;      //True 初始绘制 False 绘制中
};

其中增加了

mousePressEvent mouseRealseEvent mouseMoveEvent 

用于监听画笔(鼠标)状态

增加私有变量m_lineFList 存储一次有效绘画所有的连接线(避免鼠标移动过快,出现断点

增加m_startPointF m_endPointF 记录每次画笔拖动的其实点,终止点坐标

这里为了避免m_lineFList 过大导致绘图过慢。画板的构造函数增加代码

setAttribute(Qt::WA_OpaquePaintEvent );//update 不擦除界面

每次update界面都不会重绘

记录画刷(鼠标)

void VDCSketchpadWidget::mousePressEvent(QMouseEvent *event) {
    m_bValidDraw = event->button() == Qt::LeftButton;
    if(m_bValidDraw)
        m_startPointF =event->pos();
    m_lineFList.clear();
}
void VDCSketchpadWidget::mouseReleaseEvent(QMouseEvent *event)
{
}
void VDCSketchpadWidget::mouseMoveEvent(QMouseEvent *event)
{
    if(m_bValidDraw)
    {
        m_endPointF =event->pos();
        m_lineFList<<QLineF(m_startPointF,m_endPointF);
        m_startPointF = m_endPointF;
        qDebug()<< "point List "<<m_lineFList.size();
        update();
    }
}

其中绘画函数如下

void VDCSketchpadWidget::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    if(m_bStart)
    {
        drawBackGround(painter);
        m_bStart =false;
    }
    else
        drawUserDraw(painter);
}

3.右键擦除所有绘画

将realseMouseEvent函数修改为如下代码即可

void VDCSketchpadWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
    {
        m_bStart =true;
        update();
    }
}

m_bStart =true paintEvent绘制背景图

三步完成后

这样一个简易的画板就制作完成了。

效果如图


如需查看代码详情,请参见源码地址:https://download.csdn.net/download/u013211185/10462975

GitHub地址:https://github.com/HuBuBei/Qt/tree/master/QSketchpad


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!