Каким-то образом у меня возникло ощущение, что ОП действительно должен быть возможен ...
... и попробовал сам.
Вот что я получил (testQPixmapCombine.cc
):
#include <QtWidgets>
class Label: public QLabel {
private:
QPixmap _qPixmap;
public:
Label(QWidget *pQParent = nullptr):
QLabel(pQParent)
{ }
virtual ~Label() = default;
Label(const Label&) = delete;
Label& operator=(const Label&) = delete;
void setPixmap(const QPixmap &qPixmap)
{
_qPixmap = qPixmap;
QLabel::setPixmap(_qPixmap = qPixmap);
}
protected:
virtual void mousePressEvent(QMouseEvent *pQEvent) override;
};
void Label::mousePressEvent(QMouseEvent *pQEvent)
{
// clear overlay
QPixmap qPixmapDraw(_qPixmap.size());
qPixmapDraw.fill(QColor(0, 0, 0, 0));
// draw red circle at mouse coordinates
{ QPainter qPainter(&qPixmapDraw);
qPainter.setPen(QPen(Qt::red, 2));
qPainter.drawEllipse(pQEvent->pos(), 20, 20);
}
// combine pixmaps
QPixmap qPixmapComp = _qPixmap;
{ QPainter qPainter(&qPixmapComp);
qPainter.drawPixmap(0, 0, qPixmapDraw);
}
QLabel::setPixmap(qPixmapComp);
pQEvent->accept();
}
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// load image file
const QImage qImg("cat.png");
QPixmap qPixmap;
qPixmap.convertFromImage(qImg);
// setup UI
Label qWin;
qWin.setWindowTitle(QString::fromUtf8("Combine Pixmaps"));
qWin.setPixmap(qPixmap);
qWin.show();
// runtime loop
return app.exec();
}
и соответствующий проект Qt (testQPixmapCombine.pro
):
SOURCES = testQPixmapCombine.cc
QT += widgets
Я скомпилировал и протестировал в cygwin64 :
$ qmake-qt5 testQPixmapCombine.pro
$ make && ./testQPixmapCombine
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQPixmapCombine.o testQPixmapCombine.cc
g++ -o testQPixmapCombine.exe testQPixmapCombine.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
Qt Version: 5.9.4
Внизу изображения есть маленький красный кружок, который появился после того, как я нажал на засов.
Должен признаться, что касается моего кода, мне даже не потребовались дополнительные QPixmap
. (Я хотел продемонстрировать, что рисование с прозрачным растровым изображением работает, как и ожидалось, - в соответствии с вопросом OP.)
Эта альтернативная реализация Label::mousePressEvent()
произвела бы такой же эффект:
void Label::mousePressEvent(QMouseEvent *pQEvent)
{
QPixmap qPixmapDraw(_qPixmap);
// draw red circle at mouse coordinates
{ QPainter qPainter(&qPixmapDraw);
qPainter.setPen(QPen(Qt::red, 2));
qPainter.drawEllipse(pQEvent->pos(), 20, 20);
}
QLabel::setPixmap(qPixmapDraw);
pQEvent->accept();
}
Обратите внимание, что я рассмотрел то, что было затронуто как потенциальную проблему в Ответе Kerndog73 : Обозначив QPainter qPainter
дополнительной парой фигурных скобок, я достиг того же эффекта, что отмечен в документе. из QPainter::end()
:
Заканчивается покраска. Любые ресурсы, используемые во время рисования, освобождаются. Обычно вам не нужно вызывать это, поскольку он вызывается деструктором.
(Подчеркните - мое.)