Qt實(shí)現(xiàn)電子白板,雙圖層,下面顯示視頻幀,上面顯示批注內(nèi)容,支持畫筆,橡皮檫
原理:
視頻幀使用QImage顯示,批注內(nèi)容繪制在QPixmap上,QPainter顯示繪制QImage,再繪制QPixmap
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTimer> #include <QDebug> #include <QPainter> // 畫家類 #include <QPaintEvent> #include <QMouseEvent> #include <QPoint> #include <QPolygon> enum class HuabiType{Line, Rubber}; QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); void mousePressEvent(QMouseEvent* e); // 按下 void mouseMoveEvent(QMouseEvent* e); // 移動(dòng) void mouseReleaseEvent(QMouseEvent* e); // 釋放 void paintEvent(QPaintEvent *); private: Ui::Widget *ui; QImage m_img; QPixmap m_draw; HuabiType m_type = HuabiType::Line; QList<QPoint> point_list; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" #include <QListView> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); connect(ui->pushButton, &QPushButton::clicked, [=](){m_type = HuabiType::Line;}); connect(ui->pushButton_2, &QPushButton::clicked, [=](){m_type = HuabiType::Rubber;}); m_img.load("E:1.jpg"); m_draw = QPixmap(800, 600); m_draw.fill(Qt::transparent); } Widget::~Widget() { delete ui; } void Widget::mousePressEvent(QMouseEvent *e) { point_list.append(e->pos()); } void Widget::mouseMoveEvent(QMouseEvent *e) { point_list.append(e->pos()); update(); } void Widget::mouseReleaseEvent(QMouseEvent *e) { point_list.append(e->pos()); update(); point_list.clear(); } void Widget::paintEvent(QPaintEvent *) { QPainter p(this); QPen pen(QColor("red")); // 設(shè)置筆的顏色 pen.setWidth(3); // 設(shè)置筆-粗細(xì) // 繪制視頻幀 if(!m_img.isNull()) { p.drawImage(ui->widget->geometry(), m_img); } // 繪制批注 p.drawPixmap(ui->widget->geometry(), m_draw); // ========== QPainter p1(&m_draw); p1.setPen(pen); if(m_type == HuabiType::Line) { QPolygon pol; for(int i=0;i<point_list.count()-1;i++) { p1.drawLine(point_list.at(i), point_list.at(i+1)); } } else { p1.setCompositionMode(QPainter::CompositionMode_Clear); // 使用透明繪制模式 for(QPoint point: point_list) { QRect r(point.x() - 10, point.y() - 10, 20, 20); p1.eraseRect(r); } } }


浙公網(wǎng)安備 33010602011771號(hào)