Добавление сигналов/слотов (QObject) в QGraphicsItem: производительность?

Я хочу добавить сигналы/слоты в QGraphicsItem, чтобы я мог достичь QGraphicsItemObjects из другого потока. Есть два варианта, о которых я знаю: используйте QGraphicsObject или наследуйте от QObject и QGraphicsItem.

Использование QGraphicsObject

Это считается медленным. Согласно этот ответ на stackoverflow QGraphicsObjects медленны из-за их реализации. Когда я смотрю в источнике QGraphicsObjects, я вижу много сигналов, излучаемых в соответствии с изменениями, внесенными в объект. Для меня это кажется правдоподобным аргументом в пользу того, почему QGraphicsObjects являются медленными, но я думаю, что этот удар производительности (если это действительно один) можно избежать вторым решением.

Унаследовано от QObject и QGraphicsItem.

При построении класса, который наследуется от QObject и QGraphicsItem, кажется, что вы получаете самую интересную функцию QGraphicsObject за вычетом производительности: вы можете определить слоты и испускать сигналы в своем классе, но вы не наследуете реализацию по умолчанию QGraphicsObject, который будет постоянно излучать сигналы об изменениях, которые могут вас не интересовать. Теперь вы можете излучать сигналы, но не должны беспокоиться о том, что сигналы испускаются для вещей, которые вам не нужны (значение x, которое изменяется, испускает сигнал в QGraphicsObject, но не в этом решении).

Резюме моего вопроса

  • Являются ли QGraphicsObjects более медленными, чем QGraphicsItems?
  • Если это так, это потому, что реализация испускает сигналы (и излучающие сигналы являются большой успех)?
  • И если это так, делает ли второе решение (множественное наследование) это наказание?

Ответ 1

Являются ли QGraphicsObjects более медленными чем QGraphicsItems?

Да. Ваш анализ правильный. QGraphicsObjects медленнее из-за сигнализации, которую они выполняют. Они также имеют большие накладные расходы памяти, поскольку они наследуют от QObject, что может значительно повлиять на производительность, если создается много объектов QGraphicsObject.

Если это так, это потому, что реализация испускает сигналы (и излучающие сигналы - большая производительность хит)?

Да, если используется способ использования элементов, это вызывает чрезмерную сигнализацию. Однако излучающие сигналы могут быть не такими дорогими, как другие операции. В в разговоре "Qt GraphicsView in Depth" Алексис Менард говорит, что призывы к itemChange медленны и что иногда лучше слушать непосредственно для изменений. И QGraphicsItems, и QGraphicsObjects будут иметь штраф от использования itemChange.

И если да, то второе решение (множественное наследование), избегайте этого штраф?

Да. Некоторых ненужных сигналов можно было бы избежать, наследуя как от QGraphicsItem, так и от QObject, и только излучающие сигналы для того, что необходимо. Конечно, память из QObject по-прежнему будет иметь место.

Ответ 2

Этот поток предлагает другой вариант: Создайте подкласс QObject, чтобы испускать сигналы от имени ваших QGraphicsItems.

Если у вас много QGraphicsItems, которые могут совместно использовать один QObject, тогда это будет более легкий, чем каждый QGraphicsItem наследует QObject.