почему строка исчезает после отпускания курсора мыши? - PullRequest
0 голосов
/ 23 июня 2019

Я рисую поверх QLabel, который содержит изображение (QImage img), но после отпускания курсора мыши рисунок исчезает. Я думаю, что painttevent рисует на ярлыке, а не на изображении 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 Ответ

1 голос
/ 24 июня 2019

Вот минимальный пример, который иллюстрирует то, что мы сказали.

  • Вам не нужно 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...