【发布时间】:2019-06-26 09:43:36
【问题描述】:
我在包含图像 (QImage img) 的 QLabel 上绘画,但在释放鼠标光标后,绘画消失了。我认为paintevent 在标签上绘制而不是在图像 mPix 上如何绘制图像?这样即使我移除光标,绘图仍然存在
此后,如果有人有帮助我的想法,我想移动这些几何形状并通过光标调整它们的大小。
label.cpp:
void Label::mousePressEvent(QMouseEvent* event) {
mousePressed = true;
switch (_paintMode) {
case PaintLine: {
mLine.setP1(event->pos());
mLine.setP2(event->pos());
}
break;
case PaintCirc: {
mCirc.setTopLeft(event->pos());
mCirc.setBottomRight(event->pos());
}
}
}
void Label::mouseMoveEvent (QMouseEvent* mouse_event) {
if (mouse_event->type() == QEvent::MouseMove) {
switch (_paintMode) {
case PaintLine: {
mLine.setP2(mouse_event->pos());
}
break;
case PaintCirc:{
mCirc.setBottomRight(mouse_event->pos());
}
}
update();
}
}
void Label::paintEvent(QPaintEvent* event) {
QLabel::paintEvent(event);
QPainter painter(this);
QPen pen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
if (mousePressed) {
switch (_paintMode) {
case PaintLine: {
painter.drawLine(mLine);
}
break;
case PaintCirc: {
painter.drawEllipse(mCirc);
}
}
}
}
void Label::mouseReleaseEvent(QMouseEvent*) {
mousePressed = false;
}
Mainwindow.cpp:
void MainWindow::on_actionOpen_triggered() {
mPix=QPixmap::fromImage(img);
ui->label->setPixmap(mPix);
}
【问题讨论】:
-
删除
paintEvent中的条件if(mousePressed)以始终画线。 -
不,他的意思是把
if(mousePressed)从paintEvent中去掉,这样即使不按鼠标也能画出几何图形。 -
你想达到什么目的?你想画几条线吗?
-
试想一下,当
paintEvent被调用时,之前绘制的图像被清除了。现在您应该知道为什么当您释放鼠标时您的线消失了(参见 Romha Korev 的评论)。现在,如果您想绘制多条线,您可以在按下鼠标按钮时在容器中添加一条新线(例如QVector),然后在您的paintEvent中绘制存储在容器中的每条线。 -
“然后绘制一个新的”不适用于每种类型只有一个成员。将它们添加到列表中。总是在绘制事件中绘制列表中的所有项目。