2015-04-01 528 views
0

下面是在窗口小部件上繪製線條的代碼。問題在於它保留了先前繪製的線條,並且在每次移動鼠標時它都會一次又一次地繪製。我想繪製像mspaint,即只在鼠標釋放事件,它會最終確定線條繪製(否則只是預覽線)。我想到的一個想法是在每次鼠標移動時刪除預覽行,另一個想法是利用一些臨時視圖並在鼠標釋放時完成它。但難以找到正確的方法如何做到這一點。 感謝您的幫助在QtWidget上動態繪製線條

#include "paintwidget.h" 
#include "ui_paintwidget.h" 

#include <QtGui> 

paintWidget::paintWidget(QWidget* parent) 
    : QWidget(parent) 
    , ui(new Ui::paintWidget) 
{ 
    ui->setupUi(this); 

    m_nInitialX = 0; 
    m_nInitialY = 0; 
    m_nFinalX = 0; 
    m_nFinalY = 0; 
    m_nPTargetPixmap = 0; 
    m_nPTargetPixmap = new QPixmap(400, 400); 
    m_nbMousePressed = false; 
} 

paintWidget::~paintWidget() 
{ 
    delete ui; 
} 

void paintWidget::mousePressEvent(QMouseEvent* event) 
{ 
    m_nbMousePressed = true; 
    m_nInitialX = event->pos().x(); 
    m_nInitialY = event->pos().y(); 
} 

void paintWidget::mouseReleaseEvent(QMouseEvent* event) 
{ 
    m_nbMousePressed = false; 
    //update(); 
} 

void paintWidget::paintEvent(QPaintEvent* e) 
{ 
    if (m_nbMousePressed) { 
     QPainter PixmapPainter(m_nPTargetPixmap); 
     QPen pen(Qt::green); 
     PixmapPainter.setPen(pen); 
     //PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY); 
    } 
    QPainter painter(this); 
    painter.drawPixmap(0, 0, *m_nPTargetPixmap); 
} 

void paintWidget::mouseMoveEvent(QMouseEvent* event) 
{ 
    if (event->type() == QEvent::MouseMove) { 
     QPainter PixmapPainter(m_nPTargetPixmap); 
     QPen pen(Qt::black); 
     PixmapPainter.setPen(pen); 
     PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY); 
     update(); // update your view 
     m_nFinalX = event->pos().x(); 
     m_nFinalY = event->pos().y(); 
    } 
    update(); // update your view 
} 

回答

2

我在這裏把我的資料來源:

https://github.com/peteristhegreat/persistent_paint

注意添加評論

下面是相關文件:

#include "paintwidget.h" 
#include <QPainter> 
#include <QPen> 
#include <QBrush> 
#include <QDebug> 

PaintWidget::PaintWidget(QWidget *parent) : QWidget(parent) 
{ 
// the ui form wasn't needed here, so I added it without it. 

// QLine neatly keeps track of both the two points, m_line in this case 
// m_nInitialX = 0; 
// m_nInitialY = 0; 
// m_nFinalX = 0; 
// m_nFinalY = 0; 
// m_nPTargetPixmap = 0; 
// m_nPTargetPixmap = new QPixmap(400,400); 
    m_nPTargetPixmap = QPixmap(400,400);// put the pixmap on the stack instead of the heap 
    m_nPTargetPixmap.fill(); 
    m_nbMousePressed = false; 
} 

PaintWidget::~PaintWidget() 
{ 
// delete ui; 
} 

void PaintWidget::mousePressEvent(QMouseEvent* event) 
{ 
    m_nbMousePressed = true; 
// m_nInitialX = event->pos().x(); 
// m_nInitialY = event->pos().y(); 
    m_line.setP1(event->pos()); 
    m_line.setP2(event->pos()); 
} 

void PaintWidget::mouseReleaseEvent(QMouseEvent *event) 
{ 
    m_nbMousePressed = false; 
    update(); 
} 

void PaintWidget::paintEvent(QPaintEvent *e) 
{ 
    static bool wasPressed = false; 
    QPainter painter(this); 

    if(m_nbMousePressed) 
    { 
     painter.drawPixmap(0, 0, m_nPTargetPixmap); 
     painter.drawLine(m_line); 
     wasPressed = true; 
    } 
    else if(wasPressed) 
    { 
     // Note that this painting only needs to happen once, 
     // right when the mouse is released. 
     QPainter PixmapPainter(&m_nPTargetPixmap); 
     QPen pen(Qt::green); 
     PixmapPainter.setPen(pen); 
     PixmapPainter.drawLine(m_line); 

     painter.drawPixmap(0, 0, m_nPTargetPixmap); 
     wasPressed = false; 
    } 
} 

void PaintWidget::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->type() == QEvent::MouseMove) 
    { 
//  QPainter PixmapPainter(m_nPTargetPixmap); 
//  QPen pen(Qt::black); 
//  PixmapPainter.setPen(pen); 
//  PixmapPainter.drawLine(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY); 
//  m_nFinalX = event->pos().x(); 
//  m_nFinalY = event->pos().y(); 
     m_line.setP2(event->pos()); 
//  update(); // update your view 
    } 
    update(); // update your view 
} 

更新:使用QGraphicsScene和繪製線條和省略號的附加信息:

QGraphicsScene有點擊場景時可添加的直線和省略號。

How to draw a point (on mouseclick) on a QGraphicsScene?

Arc in QGraphicsScene

http://doc.qt.io/qt-5/graphicsview.html

http://doc.qt.io/qt-5/examples-graphicsview.html

該實施例尤其似乎是相似的:

http://doc.qt.io/qt-5/qtwidgets-graphicsview-diagramscene-example.html

希望有所幫助。

+0

我的理解是m_nPTargetPixmap是作爲一個額外的繪圖層工作,當鼠標被釋放時,它正在畫家畫。這是對的嗎? – ruben 2015-04-01 20:19:19

+1

是的。最先畫的是底部,最後畫的是頂部。 – phyatt 2015-04-01 20:48:01