我在 Qt 中创建了一个表单, QLabel 将 .png 图像作为背景图片。现在我想在背景 .png 图像上绘制 .png 图像。我可以在背景上绘制图像,如果没有.png / .jpeg图像作为背景,即,可以在没有任何背景图像的普通形式上。每当我尝试在背景图像上使用 QPainter.drawimage 绘制图像时,背景图像仅可见,即背景静态图像(.png)叠加图像('。png'使用动态绘制的QPainter.drawImage)。
任何人都可以让我知道这种方法的解决方案。如果没有,请让我知道其他一些方法。在此先感谢:)
答案 0 :(得分:1)
最简单的方法是对QLabel进行子类化,添加其他方法以接受前景/背景像素图,并覆盖paintEvent函数。
其他方法可能如下所示:
// literally the same thing as setPixmap but constructed a new function to be clearer
void CustomLabel::setBackground(const QPixmap & pixmap)
{
// will handle sizing the label to the size of the image
// and will additionally handle drawing of the background
this->setPixmap(pixmap);
}
void CustomLabel::setForeground(const QPixmap & pixmap)
{
// create member variable that points to foreground image
this->foreground = pixmap;
}
然后,覆盖paintEvent函数:
void CustomLabel::paintEvent(QPaintEvent * e)
{
// use the base class QLabel paintEvent to draw the background image.
QLabel::paintEvent(e);
// instantiate a local painter
QPainter painter(this);
// draw foreground image over the background
// draws the foreground starting from the top left at point 0,0 of the label.
// You can supply a different offset or source/destination rects to achieve the
// blitting effect you want.
painter.drawPixmap(QPoint(0,0),this->foreground);
}
...然后您可以按如下方式使用标签:
//instantiate a custom label (or whatever you choose to call it)
label = new CustomLabel();
// use the additional methods created as part of your CustomLabel class
label->setBackground(QPixmap("background.png"));
label->setForeground(QPixmap("foreground.png"));
此外,可以进一步扩展CustomLabel类,以接受多个背景和前景图像。例如,setPixmaps(QVector<QPixmap>)
函数可以存储传递的图像矢量,将标签大小调整为矢量中的第一个图像,然后利用paintEvent函数绘制传递给它的所有图像。
请记住,前景图像的尺寸应小于或等于背景图像,以便不裁剪前景图像。 (因为QPainter不会管理调整小部件的大小。)
编辑:
现在我只想用新图像覆盖背景(尺寸30x30) 使用在背景上移动的'Qpainter.drawImage' 图像(1366×768)。这就像移动鼠标指针一样 屏幕为背景形式的屏幕(.png图像在屏幕上 Qlabel)&amp; mousepointer是使用动态绘制的newimage 'Qpainter.drawImage'
为了实现这一点,您可以对setForeground函数进行简单的编辑/重载,并像这样修改paintEvent函数:
void CustomLabel::setForeground(const QPixmap & pixmap, const QPointF & offset)
{
// create member variable that points to foreground image
this->foreground = pixmap;
// establish the offset from the top left corner of the background image
// to draw the top left corner of the foreground image.
this->foregroundOffset = offset;
}
void CustomLabel::paintEvent(QPaintEvent * e)
{
// use the base class QLabel paintEvent to draw the background image.
QLabel::paintEvent(e);
// instantiate a local painter
QPainter painter(this);
// draw foreground image over the background using given offset
painter.drawPixmap(this->foregroundOffset,this->foreground);
}