话不多说直接上全部代码:
1.头文件:
#ifndef NEWLABLE_H
#define NEWLABLE_H
#include <QLabel>
#include <QMouseEvent>
#include <QPixmap>
#include <QQueue>
#include <QStack>
class newLable : public QLabel
{
Q_OBJECT
public:
explicit newLable(QWidget *parent = nullptr);
void mousePressEvent(QMouseEvent *ev) override;
void mouseMoveEvent(QMouseEvent *ev) override;
void paintEvent(QPaintEvent *) override;
void mouseReleaseEvent(QMouseEvent *ev) override;
signals:
private:
bool m_isDraw;
QPixmap m_pixmap;
QQueue<QPoint> m_queue;
QPoint m_pre;
};
#endif // NEWLABLE_H
cpp文件:
#include "newlable.h"
#include <QPainter>
#include <QPixmap>
#include <QDebug>
newLable::newLable(QWidget *parent) : QLabel(parent)
{
m_pixmap = QPixmap(1,1);
m_pixmap.fill(QColor(255,255,255,0));
}
void newLable::mousePressEvent(QMouseEvent *ev)
{
m_isDraw = true;
m_pre = ev->pos();
}
void newLable::mouseMoveEvent(QMouseEvent *ev)
{
if(!m_isDraw)
return;
m_queue.push_back(ev->pos());
update();
}
void newLable::paintEvent(QPaintEvent * )
{
m_pixmap = m_pixmap.scaled(width(),height());
QPainter p;
p.begin(&m_pixmap);
while(!m_queue.isEmpty())
{
QPoint pos = m_queue.dequeue();
p.drawLine(m_pre,pos);
m_pre = pos;
}
p.end();
p.begin(this);
p.drawPixmap(0,0,width(),height(),m_pixmap);
p.end();
}
void newLable::mouseReleaseEvent(QMouseEvent *ev)
{
m_isDraw = false;
m_queue.enqueue(ev->pos());
update();
}
效果: