QPainter setWorldTransform поведение по умолчанию? - PullRequest
0 голосов
/ 21 марта 2019

Следующий код показывает окно слева (см. Изображение ниже).Тем не менее, раскомментируя строку, отмеченную /*[identity transform]*/, генерируется окно справа.Как сообщает qInfo () в выводе консоли, похоже, что ничего существенного для преобразования координат не меняется.

Может кто-нибудь объяснить мне причину?Я не могу найти его в документации .

class SomeItem : public QGraphicsEllipseItem
{
public:
    explicit SomeItem(const QRectF& rect, QGraphicsItem* parent = nullptr) :
        QGraphicsEllipseItem(rect,parent){}

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
               QWidget *widget)
    {
        QTransform tr;
        //painter->setWorldTransform(tr); /*[identity transform]*/
        qInfo() << painter->window().left() << painter->window().right()
                << painter->window().top() << painter->window().bottom();
        qInfo() << painter->viewport().left() << painter->viewport().right()
                << painter->viewport().top() << painter->viewport().bottom();
        qInfo() << painter->matrix().m11() << painter->matrix().m12()
                << painter->matrix().m21() << painter->matrix().m22();
        /* <--->*/
        QGraphicsEllipseItem::paint(painter,option,widget);
    }
};

int main(int argc, char **argv)
{
    QApplication app (argc, argv);

    QGraphicsScene ms;
    ms.setSceneRect(-20,-20,40,40);
    SomeItem* si = new SomeItem(QRectF(-10,-10,20,20));
    ms.addItem(si);
    QGraphicsView view(&ms);
    view.show();

    return app.exec();
}

Вывод на консоль (для обоих случаев):

0 197 0 97
0 197 0 97
1 0 0 1

Result with commented line (left) and with uncommented line (right)

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Метод рисования использует локальную систему координат. Это означает, что источник живописца обычно расположен в верхнем левом углу QGraphicsItem (обратите внимание, что это базовый класс для всего в QGraphicsScene). В случае QGraphicsEllipseItem это должен быть центр.

По-видимому, это реализуется путем преобразования QPainter, используемого виджетом QGraphicsView, когда void QWidget :: paintEvent (событие QPaintEvent *) .

Просто каждый QGraphicsItem в QGraphicsScene, нарисованный QGraphicsView, преобразует художника для своих нужд.

Когда вы восстанавливаете преобразование личности, вы получаете художника в состоянии, которое применяется для QGraphicsView события рисования. Так что это левый верхний угол.

Тебе повезло, что ничего не сломалось, потому что ты рисуешь за пределами boundingRect .

0 голосов
/ 21 марта 2019

Рассуждая на Ответ Марека , я думаю, что нашел геометрическое объяснение. Моя вина заключалась в том, чтобы проверить painter->matrix(), а не painter->transform(). Действительно, Qmatrix не управляет переводом, в то время как painter->transform().m31() и painter->transform().m32() делают.

Подставляя следующие строки

qInfo() << painter->transform().m31() << painter->transform().m32();

вместо /*<--->*/ обеспечивает консольные выходы для двух случаев соответственно,

99 49

и

0 0
...