为什么在释放鼠标光标后线条消失了?

时间:2019-06-23 15:24:44

标签: c++ qt

我在包含图像(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);
}

1 个答案:

答案 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();
}

Screenshot