下面是在窗口小部件上繪製線條的代碼。問題在於它保留了先前繪製的線條,並且在每次移動鼠標時它都會一次又一次地繪製。我想繪製像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
}
我的理解是m_nPTargetPixmap是作爲一個額外的繪圖層工作,當鼠標被釋放時,它正在畫家畫。這是對的嗎? – ruben 2015-04-01 20:19:19
是的。最先畫的是底部,最後畫的是頂部。 – phyatt 2015-04-01 20:48:01