запас позиции элемента в QGraphicsView при изменении размера

#qt #qgraphicsview

#qt #qgraphicsview

Вопрос:

Я использую платформу графического представления для добавления элементов во время выполнения в представление. элементы будут располагаться один под другим, как в вертикальной компоновке .

я всегда размещаю свой элемент в начальной позиции сцены (10,10). но при изменении размера представления поле корректируется. как поддерживать один и тот же запас при каждом изменении размера окна просмотра?

я погуглил и нашел

 QTransform Matrix(1, 0, 0, 0, 1, 0, 0, 0, 1);
Matrix.scale(width() / sceneRect().width(), height() / sceneRect().height())
setTransform(Matrix);
  

помогает восстановить поле, но также уменьшает размер элемента в зависимости от соотношения высоты вида.

я всегда хотел поддерживать тот же размер элемента, даже если виджет просмотра сжимается или расширяется. должна появиться полоса прокрутки .

Ответ №1:

QGraphicsView — это окно просмотра сцены. Вы упоминаете добавление объектов в представление, а это не то, что вы делаете; вы добавляете их в сцену, а затем представление визуализирует их. Возможно, вы это уже понимаете, но просто для ясности.

Я думаю, что вы хотите сделать, это то, что при изменении размера представления вы хотите, чтобы отношение пикселя к сцене оставалось постоянным, и вы хотите, чтобы источник представления «придерживался» источника сцены. Вы упоминаете поле, но в отношения сцены / представления такая вещь не встроена, так что это то, что вы должны поддерживать самостоятельно. Другими словами, вы создаете поле в сцене, просто не размещая там никаких элементов, а затем вам нужно преобразовать представление так, чтобы область полей в сцене всегда находилась в пределах области просмотра представления. Я думаю, что у вас возникли проблемы со второй частью этого.

Я бы посоветовал вам изучить матрицу преобразования представления при изменении размера представления. Значения m11 и m22 — это коэффициенты масштабирования, которые показывают, как пиксели вида отображаются на координаты сцены, а dx и dy — это коэффициенты преобразования, которые показывают связь между исходным кодом вида и исходным кодом сцены.

Комментарии:

1. спасибо за четкий ответ. Да, я добавляю элемент только в сцену. допустим, координата сцены равна (0,0,1000,1000), я поместил элемент в QPoint (18,12), чтобы сохранить разрыв в поле. но когда я изменяю размер окна просмотра, эти поля увеличиваются. добавленные мной строки кода помогут сохранить поле, а также масштабировать элемент, но я должен игнорировать сокращение элемента.

2. Мне пришлось бы самому написать код, чтобы быть абсолютно уверенным, но если вы изучите эти значения матрицы преобразования, я думаю, вы обнаружите, что хотите, чтобы масштабные коэффициенты (m11 и m22) оставались неизменными при изменении размера представления. Я думаю, вам нужно будет подкласс QGraphicsView и переопределить resizeEvent и там, сбросить масштабные коэффициенты QGraphicsView.

3. конечно, я сделаю это.. большое вам спасибо. я обновлю в соответствии с вашей рекомендацией и отвечу вам здесь.