如何使用Qt中的jpeg / png图像在背景窗体上使用QPainter.drawImage绘制jpeg / png图像?

时间:2013-03-13 08:02:48

标签: c++ image qt

我在 Qt 中创建了一个表单 QLabel .png 图像作为背景图片。现在我想在背景 .png 图像上绘制 .png 图像。我可以在背景上绘制图像,如果没有.png / .jpeg图像作为背景,即,可以在没有任何背景图像的普通形式上。每当我尝试在背景图像上使用 QPainter.drawimage 绘制图像时,背景图像仅可见,即背景静态图像(.png)叠加图像('。png'使用动态绘制的QPainter.drawImage)。

任何人都可以让我知道这种方法的解决方案。如果没有,请让我知道其他一些方法。在此先感谢:)

1 个答案:

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

}