Проблема с fitInView QGraphicsView, когда ItemIgnoresTransformations включен

Пытаясь реализовать сцену, в которой размеры элементов не меняются, но увеличиваются расстояния между элементами, я столкнулся с этой проблемой в следующем коде, который рисует прямоугольник и текст «A». Теперь, если я установлю флаг ItemIgnoresTransformations для элемента прямоугольника, увеличение приведет к исчезновению прямоугольника (щелкните и перетащите кнопку мыши вокруг прямоугольника). Но в случае с текстом этого не происходит. Кроме того, новая область области просмотра, установленная fitInView, очень отличается, потому что я просил:

import sys
from PyQt4 import QtCore, QtGui

class GV(QtGui.QGraphicsView):
    def __init__(self, *args, **kwargs):
        QtGui.QGraphicsView.__init__(self, *args, **kwargs)

    def mousePressEvent(self, event):
        pos = QtCore.QPoint(event.pos())
        self.startPos = pos

    def mouseReleaseEvent(self, event):
        pos = QtCore.QPoint(event.pos())
        self.endPos = pos
        rect = QtCore.QRect(self.startPos, self.endPos) 
        sceneRect = self.mapToScene(rect).boundingRect()
        print 'Selected area: viewport coordinate:', rect, \
            ', scene coordinate:', sceneRect
        self.fitInView(sceneRect)
        print 'new viewport in scene coordinates:', \
            self.mapToScene(self.viewport().geometry()).boundingRect()

class Scene(QtGui.QGraphicsScene):
    def __init__(self, *args, **kwargs):
        QtGui.QGraphicsScene.__init__(self, *args, **kwargs)    
        self.itemA = QtGui.QGraphicsSimpleTextItem('A')
        self.itemA.setPos(20, 20)
        self.itemA.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, True)
        self.addItem(self.itemA)
        self.itemB = QtGui.QGraphicsRectItem(30, 50, 20, 20)
        self.addItem(self.itemB)
        self.itemB.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, True)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    widget = QtGui.QMainWindow()
    scene = Scene()
    view = GV(scene, widget)
    widget.setCentralWidget(view)
    widget.show()
    app.exec_()

Будем признательны за любые объяснения!


person subhacom    schedule 03.10.2012    source источник


Ответы (1)


На самом деле прямоугольник не исчезает. Но движется он «странно».

self.itemB = QtGui.QGraphicsRectItem(30, 50, 20, 20)

Эта строка может быть не той, что вам нужно. Это создает элемент и помещает прямоугольник / квадрат, начиная с (30, 50), в локальные координаты. Затем вы добавляете это в сцену. Это дает вам элемент, привязанный к (0, 0), охватывает до (50, 70), но рисует прямоугольник только в правом нижнем углу 20x20.

Когда вы устанавливаете ItemIgnoresTransformations, элемент не может выполнять свои обычные преобразования в случае увеличения. Сцена увеличивается, чтобы элемент игнорировал это преобразование, он как бы «сжимается». Но он по-прежнему закреплен на (0, 0), а прямоугольник находится в правом нижнем углу, поэтому нарисованный прямоугольник перемещается в верхний левый угол.

Решение довольно простое. Не создавайте свой прямоугольник в локальных координатах, т.е. ваш прямоугольник должен начинаться с (0, 0), и вы должны расположить его явно. Что означает следующее:

self.itemB = QtGui.QGraphicsRectItem(0, 0, 20, 20)
self.itemB.setPos(30, 50)
person Avaris    schedule 07.10.2012
comment
Спасибо, это помогает решить проблему с исчезновением. Но я думал, что в данном случае локальные координаты - это координаты сцены. Очевидно, что это не так. - person subhacom; 13.10.2012