QGraphicsWidget vs. QGraphicsLayoutItem - PullRequest
2 голосов
/ 07 ноября 2010

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

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

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

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

Вторичный вопрос, есть ли эмпирическое правило, когда вам следует наследовать от QGraphicsWidget, а не когда вы наследуете от QGraphicsLayoutItem?

Дополнительный кредит для объяснения того, когда используются sizeHint и boundingRect.

Ценю помощь, Brett

1 Ответ

3 голосов
/ 09 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...