直接使用QPainter绘制和绘制QPixmap会得出不同的结果

时间:2018-08-21 12:16:48

标签: c++ qt graphics qml qquickitem

有一个基于QQuickPaintedItem的简单类:

class PaintedItem : public QQuickPaintedItem
{
    Q_OBJECT
public:
    PaintedItem();
    void paint(QPainter *painter) override;
};

// ...

PaintedItem::PaintedItem()
{
    setRenderTarget(QQuickPaintedItem::FramebufferObject);
}

void PaintedItem::paint(QPainter *painter)
{
    painter->drawRect(0, 0, 150, 150);

    QPixmap* m_pixmap = new QPixmap(width(), height());
    m_pixmap->fill(QColor("transparent"));

    QPainter painter2(m_pixmap);
    painter2.setPen(QColor("red"));
    painter2.drawRect(0, 0, 150, 150);

    painter->drawPixmap(0, 0, *m_pixmap);
}

paint()函数仅做两件事:直接使用QPainter绘制一个矩形和绘制包含相同矩形的QPixmap。但是,如果我在构造函数中将渲染目标设置为FramebufferObject,则由于某些原因,这些矩形不匹配。如果我评论此字符串,一切正常。

使用 FramebufferObject

With FramebufferObject

FramebufferObject

Without FramebufferObject

能否请您解释一下为什么会发生以及如何处理?

1 个答案:

答案 0 :(得分:0)

最有可能的是,QQuickPaintedItem上的绘图没有被剪切,并且您绘制的矩形比您想象的要大。由于历史原因,这些矩形比您输入的尺寸宽一像素。因此您的矩形是151x151,不适合QPixmap