Использование пользовательских координат с QGraphicsScene - PullRequest
2 голосов
/ 06 июня 2010

Я экспериментирую с редактором WYSIWYG, который позволяет пользователю рисовать фигуры на странице, и поддержка графической сцены Qt кажется идеальной для этого. Однако вместо работы в пикселях я хочу, чтобы все мои QGraphicsItem объекты работали с точностью до десятых долей миллиметра, но я не знаю, как этого добиться.

Например:

// Create a scene that is the size if an A4 page (2100 = 21cm, 2970 = 29.7cm)
QGraphicsScene* scene = new QGraphicsScene(0, 0, 2100, 2970);
// Add a rectangle located 1cm across, 1cm down, 5cm wide and 2cm high
QGraphicsItem* item = scene->addRect(100, 100, 500, 200);
...
QGraphicsView* view = new QGraphicsView(scene);
setCentralWidget(view);

Теперь, когда я отображаю сцену выше, я хочу, чтобы фигуры отображались в правильном размере для DPI экрана. Это просто случай использования QGraphicsView::scale или мне нужно сделать что-то более сложное?

Обратите внимание, что если бы вместо этого я использовал собственный QWidget, я бы использовал QPainter::setWindow и QPainter::setViewport для создания пользовательского режима отображения, но я не вижу, как это сделать, используя поддержку графических сцен.

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

QGraphicsView::scale должен сделать работу. Но я предпочитаю установить transform . Это дает мне гораздо больше контроля над тем, как отображается сцена. Но это потому, что мне нужны такие вещи, как вращение, переворот и т. Д. Это также позволяет мне отслеживать, что я сделал со сценой.

0 голосов
/ 08 июня 2010

Стивен Чу направил меня по правильному пути - использование scale, кажется, работает.

const qreal xScale = physicalDpiX() / 254.0;
const qreal yScale = physicalDpiY() / 254.0;
view->scale(xScale, yScale);

В результате измерения выглядят точными на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...