Рисование непосредственно с помощью QPainter и рисование QPixmap дают разные результаты

Есть простой класс, основанный на 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

С FramebufferObject

Без FramebufferObject

Без FramebufferObject

Не могли бы вы объяснить, почему это происходит и как с этим бороться?

1 ответ

Скорее всего, опираясь на QQuickPaintedItem не обрезается, и вы рисуете прямоугольник большего размера, чем вы думаете. По историческим причинам прямоугольники на один пиксель шире, чем введенный вами размер. Таким образом, ваш прямоугольник 151x151 и не вписывается в QPixmap,

Другие вопросы по тегам