2010-11-07 3 views
2

Я работаю с QGraphicsView/Scene в первый раз. Это в PyQt, но, за исключением того факта, что Python отличается множественным наследованием, я думаю, что это общий вопрос Qt.QGraphicsWidget против QGraphicsLayoutItem

Я начал с создания нескольких перегрузок QGraphicsItem в качестве строительных блоков. Как только у меня были те, кто работал так, как я хотел, я хотел попытаться объединить их и был неприятно удивлен, обнаружив, что не могу использовать QGraphicsLayouts. Это связано с тем, что QGraphicsLayouts принимает элементы, которые наследуются от QGraphicsLayoutItem, а QGraphicsItems наследуются QGraphicsLayoutItems, которые, в свою очередь, унаследованы QGraphicsWidgets.

Существует свойство graphicsItem объекта QGraphicsItem/QGraphicsWidget, но, глядя на код, я не думаю, что могу назначить свой элемент этому свойству и заставить их работать правильно. Я нашел this example, но, как ни странно, у него есть примеры, наследующие оба класса. Довольно смущает меня.

Так что я пытаюсь найти самый простой способ заставить мои объекты работать в макетах. Есть ли более простой способ сделать это, чем переписывать и наследовать один из этих двух классов?

Вторичный вопрос: существует ли правило большого пальца, когда вы должны наследовать от QGraphicsWidget и когда вы должны наследовать от QGraphicsLayoutItem?

Дополнительный кредит для объяснения при использовании параметра sizeHint vs. boundingRect.

Цените помощь, Brett

ответ

3

Самый простой способ получить элементы, работающие в макетах, чтобы изменить наследство QGraphicsWidget и переопределить setGeometry() и sizeHint() методы. Должно быть простое изменение, так как ваши объекты будут по-прежнему быть QGraphicsItems через наследство наследства.

Рамка графики Qt разработана так, чтобы она была максимально легкой. Таким образом, существует множество вариантов для сборки элементов с различными возможностями. Если размеры элементов в макетах не являются проблемой, вы можете наследовать от QGraphicsWidget. В противном случае наследуйте от QGraphicsLayoutItem (если вам не нужны дополнительные возможности QGraphicsWidget). Поскольку вы не можете умножить наследование на классы PyQt, вам придется использовать композицию для создания элемента, управляемого QGraphicsLayoutItem, как в примере, на который вы ссылались.

Метод boundingRect() используется сценой для управления элементами. Метод sizeHint() используется макетами для определения размера элементов макета. Метод shape() используется сценой для более точного определения местоположения элементов (для коллизий, тестов на удар и т. Д.).

+0

Можете ли вы подробнее рассказать? Моя проблема в том, что если я наследую QGraphicsItem, я должен переопределить boundingRect. Но если я наследую QGraphicsWidget, я этого не делаю. Хотя QGraphicsWidget наследуется от QGraphicsItem. Таким образом, очевидно, что не абстрактная реализация. И кажется (мне) sizeHint, setGeometry и boundingRect все связаны. Чтобы перефразировать ваш ответ, мне кажется, что как boundingRect(), так и sizeHint() используются «сценой» для управления элементами ». –

+0

Да, sizeHint, setGeometry и boundingRect связаны потому, что все они относятся к размеру и положению виджета. РазмерHint сообщает макет, какой размер должен выглядеть виджет. SetGeometry - это то, как макет сообщает виджету размер, который должен быть. Функция boundingRect - это то, как виджет сообщает сценам, какой размер он имеет. QGraphicsScene не использует sizeHint(). Он используется только в QGraphicsLayout (и связанных классах). – baysmith

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