QGraphicsView не изменяет размер после масштабирования растрового изображения, в то время как растровое изображение больше не центрируется

Я создал QGraphicsView и внутри него QGraphicsScene. Я загружаю растровое изображение в QGraphicsScene. На самом деле это унаследованный QGraphicsScene, который реализует wheelEvent, чтобы сделать функцию увеличения/уменьшения масштаба. Функция масштабирования масштабирует растровое изображение на 10% вверх или вниз в зависимости от вращения колеса. Масштабирование работает нормально, однако размер QGraphicsView или размер QGraphicsScene получает значение максимального размера вращения, которое было испробовано, и больше не центрируется. Например, если я увеличу его с помощью wso, чтобы включить полосы прокрутки, то, если я уменьшу его, полосы прокрутки все еще будут включены, а растровое изображение будет в верхнем левом углу. Какие-либо предложения?

Изменить: функция масштабирования QGraphicsView создает растровое изображение низкого качества, поэтому я его не использую. Я добавляю масштабированное растровое изображение и при каждом повороте снова масштабирую его и проецирую в GraphicsView. Однако размер GraphicsView или QGraphicsScene имеет проблемы с изменением размера, как упоминалось ранее.


person intergallactic    schedule 23.04.2014    source источник
comment
посмотрите, поможет ли мой вопрос stackoverflow.com/questions/19113532/   -  person AngryDuck    schedule 23.04.2014
comment
@AngryDuck проблема с функцией масштабирования QGraphicsView заключается в том, что она создает представление растрового изображения низкого качества, и именно поэтому я ее не использую.   -  person intergallactic    schedule 23.04.2014
comment
подождите, если вы просто хотите загрузить изображение с другим разрешением при каждой прокрутке колеса вместо фактического масштабирования изображения, поскольку оно делает его пиксельным, тогда просто очистите сцену от события колеса мыши и просто добавьте большее или меньшее изображение в графический вид в зависимости от прокрутка мыши (не идеально, но кажется, что все, о чем вы просите)   -  person AngryDuck    schedule 24.04.2014
comment
@AngryDuck, это то, чего я хочу. Проблема заключалась в том, что сцена не соответствовала размеру растрового изображения. Например, когда я прокручивал и создавал большое растровое изображение, так что были необходимы полосы прокрутки, тогда, если я прокручивал и создавал маленькое растровое изображение, полосы прокрутки все еще были, потому что размер сцены не изменился. Однако я нашел решение этой проблемы, установив прямоугольник в сцене после добавления нового растрового изображения.   -  person intergallactic    schedule 24.04.2014


Ответы (2)


Спустя долгое время я нашел решение этой проблемы. Проблема заключалась в том, что сцена не соответствовала размеру растрового изображения. Например, когда я прокручивал и создавал большое растровое изображение, так что были необходимы полосы прокрутки, тогда, если я прокручивал и создавал маленькое растровое изображение, полосы прокрутки все еще были, потому что размер сцены не изменился. Однако я нашел решение этой проблемы, установив прямоугольник в сцене после добавления нового растрового изображения. Таким образом, внутри функции wheelEvent (self, event), после очистки сцены с помощью self.clear() и добавления нового масштабированного растрового изображения, размер сцены также должен измениться. Для этого я использовал приведенную ниже команду, где self.__size — новый размер масштабированного растрового изображения.

self.setSceneRect(QtCore.QRectF(0.0, 0.0, self.__size.width(), self.__size.height()))
person intergallactic    schedule 24.04.2014

Не делайте подкласс QGraphicsScene. Подкласс QGraphicsView для получения событий колеса и соответствующим образом измените преобразование вида. Установите мировое преобразование в графическом представлении с помощью setTransform.

Это правильный способ сделать это. Концептуально объекты на сцене не меняют размер. Меняется ваше представление, вы увеличиваете/уменьшаете масштаб. Это камера движется, а не объекты увеличиваются/уменьшаются.

Вы можете использовать уровень детализации в методе рисования объекта элемент для рисования версий изображения с высоким или низким разрешением в зависимости от коэффициента масштабирования.

Существует хорошая демонстрация с 4000 чипов, где уровень детализации использовал.

person Bgie    schedule 23.04.2014
comment
когда вы говорите трансформация, вы имеете в виду масштабирование? (Проблема с масштабированием заключается в том, что создается растровое изображение низкого качества.) - person intergallactic; 23.04.2014