2010-06-06 5 views
2

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

Например:

// 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

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

0

Stephen Chu настроил меня на правильном пути - с помощью scale, похоже, работает.

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

Это приводит к измерениям, которые выглядят точными на экране.

Смежные вопросы