我在包含图像(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);
}
答案 0 :(得分:1)
这里是一个最小的例子,说明了我们所说的话。
mousePressed
中的paintEvent
仅出于简洁和简单的目的绘制椭圆。
#include <vector>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtGui/QPainter>
#include <QtGui/QMouseEvent>
class Draw : public QWidget
{
public:
Draw()
: mMousePressed( false )
, mCirc( nullptr ) {
}
void mousePressEvent( QMouseEvent* event ) {
mCircs.emplace_back();
mCirc = &mCircs.back();
mCirc->setTopLeft( event->pos() );
mCirc->setBottomRight( event->pos() );
mMousePressed = true;
}
void mouseMoveEvent( QMouseEvent* event ) {
if( mMousePressed && mCirc) {
mCirc->setBottomRight( event->pos() );
}
update();
}
void mouseReleaseEvent( QMouseEvent* event ) {
mMousePressed = false;
mCirc = nullptr;
}
void paintEvent( QPaintEvent* event ) {
QWidget::paintEvent( event );
QPainter painter( this );
QPen pen( Qt::red, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin );
painter.setPen( pen );
for( auto const& circ : mCircs ) {
painter.drawEllipse( circ );
}
}
private:
std::vector<QRectF> mCircs;
QRectF* mCirc;
bool mMousePressed;
};
int main( int argc, char** argv) {
QApplication app(argc, argv);
Draw draw;
draw.show();
app.exec();
}