How to draw over an old picture in QGraphicsScene
-
I append 2 images on QLabel
QImage mapImage(":/Images/Images/mapMain.png"); myImageViewer->setImage(mapImage); QImage base(":/Images/Images/mapMain.png"); // set to some file/size QImage overlay(":/Images/Images/mapTop.png"); // set to some file/size QPainter paint(&base); paint.drawImage(0,0,overlay); myImageViewer->imageLabel->setPixmap(QPixmap::fromImage(base)); ui->verticalLayout->addWidget(myImageViewer); //Pen myPen.setWidth(20); myPen.setColor(Qt::green); //myPen.setColor(QColor(255, 0, 0, 10)); myPen.setCapStyle(Qt::RoundCap); myPen.setStyle(Qt::SolidLine); myImageViewer->installEventFilter(this);In the Mainwindow constructor, I wrote:
QPixmap myPixmap; QPen myPen; QPoint lastPoint; bool eventFilter(QObject *obj, QEvent *event);And wrote such eventFilter:
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { qDebug()<<"eventFilter"; if(obj == myImageViewer and event->type() == QEvent::MouseButtonPress) { qDebug()<<" QEvent::MouseButtonPress"; QMouseEvent *mous = (QMouseEvent*)event; QPainter p(&myPixmap); p.setPen(myPen); p.drawPoint(mous->pos()); p.end(); lastPoint = mous->pos(); myImageViewer->imageLabel->setPixmap(myPixmap); } if(obj == myImageViewer and event->type() == QEvent::MouseMove) { QMouseEvent *mous = (QMouseEvent*)event; QPainter p(&myPixmap); p.setPen(myPen); p.drawLine(lastPoint,mous->pos()); p.end(); lastPoint = mous->pos(); myImageViewer->imageLabel->setPixmap(myPixmap); } }When eventfilter is triggered, the picture disappears and a white screen appears. And Qt gives an error message:
QEvent::MouseButtonPress
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setPen: Painter not active
QPainter::drawPoints: Painter not active
QPainter::end: Painter not active, aborted -
I append 2 images on QLabel
QImage mapImage(":/Images/Images/mapMain.png"); myImageViewer->setImage(mapImage); QImage base(":/Images/Images/mapMain.png"); // set to some file/size QImage overlay(":/Images/Images/mapTop.png"); // set to some file/size QPainter paint(&base); paint.drawImage(0,0,overlay); myImageViewer->imageLabel->setPixmap(QPixmap::fromImage(base)); ui->verticalLayout->addWidget(myImageViewer); //Pen myPen.setWidth(20); myPen.setColor(Qt::green); //myPen.setColor(QColor(255, 0, 0, 10)); myPen.setCapStyle(Qt::RoundCap); myPen.setStyle(Qt::SolidLine); myImageViewer->installEventFilter(this);In the Mainwindow constructor, I wrote:
QPixmap myPixmap; QPen myPen; QPoint lastPoint; bool eventFilter(QObject *obj, QEvent *event);And wrote such eventFilter:
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { qDebug()<<"eventFilter"; if(obj == myImageViewer and event->type() == QEvent::MouseButtonPress) { qDebug()<<" QEvent::MouseButtonPress"; QMouseEvent *mous = (QMouseEvent*)event; QPainter p(&myPixmap); p.setPen(myPen); p.drawPoint(mous->pos()); p.end(); lastPoint = mous->pos(); myImageViewer->imageLabel->setPixmap(myPixmap); } if(obj == myImageViewer and event->type() == QEvent::MouseMove) { QMouseEvent *mous = (QMouseEvent*)event; QPainter p(&myPixmap); p.setPen(myPen); p.drawLine(lastPoint,mous->pos()); p.end(); lastPoint = mous->pos(); myImageViewer->imageLabel->setPixmap(myPixmap); } }When eventfilter is triggered, the picture disappears and a white screen appears. And Qt gives an error message:
QEvent::MouseButtonPress
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setPen: Painter not active
QPainter::drawPoints: Painter not active
QPainter::end: Painter not active, aborted@Mikeeeeee Why do you paint in eventFilter?!
You already were told to paint in paintEvent.
In eventFilter you only store needed information (like x/y). -
-
But in the example that I showed you drawing eventfilter occurs, and if you do so, then paintEvent works only a couple of times and then for some reason no longer works.
void MainWindow::paintEvent(QPaintEvent *event) { qDebug()<<"paintEvent"; }@Mikeeeeee After getting new coordinates you can call https://doc.qt.io/qt-5/qwidget.html#update to trigger paint event.
-
It turns out to draw in eventFilter, but it was necessary to add this line to the constructor.
myPixmap = QPixmap(myImageViewer->image.width(),myImageViewer->image.height());I draw so:
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if(obj == myImageViewer and event->type() == QEvent::MouseButtonPress) { qDebug()<<" QEvent::MouseButtonPress"; QMouseEvent *mous = (QMouseEvent*)event; QPainter p(&myPixmap); p.setPen(myPen); p.drawPoint(mous->pos()); p.end(); lastPoint = mous->pos(); myImageViewer->imageLabel->setPixmap(myPixmap); } }But when drawing the picture disappears and the screen turns black. How to fix? Can I set the drawing on the QImage overlay(":/Images/Images/mapTop.png");?
-
myPixmap.fill(Qt::transparent);
-
Thanks. Do so:
myPixmap = QPixmap(myImageViewer->image.width(),myImageViewer->image.height()); myPixmap.fill(Qt::transparent); myPixmap = QPixmap(":/Images/Images/mapTop.png");But after drawing the picture disappears :
myImageViewer->setImage(mapImage);How to get myPixmap the images:":/Images/Images/mapMain.png" and ":/Images/Images/mapTop.png" , but draw only on:
":/Images/Images/mapTop.png"? -
Thanks. Do so:
myPixmap = QPixmap(myImageViewer->image.width(),myImageViewer->image.height()); myPixmap.fill(Qt::transparent); myPixmap = QPixmap(":/Images/Images/mapTop.png");But after drawing the picture disappears :
myImageViewer->setImage(mapImage);How to get myPixmap the images:":/Images/Images/mapMain.png" and ":/Images/Images/mapTop.png" , but draw only on:
":/Images/Images/mapTop.png"?@Mikeeeeee
You mean draw myPixmap on mapImage and then
show the combined image with myImageViewer->setImage(mapImage); ?
Thats like before where we combined them. -
@Mikeeeeee Please, read the documentation.
QBitmap::fromImage is a static method. You're using it wrong.
QPixmap::setMask takes a const reference to a QBitmap, not a pointer.