Подтвердить что ты не робот

Получить список всех QObject, созданных в приложении

Чтобы получить список всех QWidgets, созданных в приложении, мы можем просто вызвать QApplication::allWidgets().

Я прочитал документацию, и я не нашел ничего подобного, чтобы получить список всех QObjects. Если приложение создает автономные QObjects, которые не являются QWidgets, у меня нет такой функции для использования.

Есть ли способ получить такой список?

4b9b3361

Ответ 1

Для начала важно понять разницу между классами QObject и QWidget.

класс QObject

У экземпляров QObject есть указатель на их родительский объект, который может быть или не быть нулевым указателем. Достаточно законно создавать экземпляр QObject без родителя, если вы понимаете, что это ваша ответственность за это время жизни, т.е. Если вы не delete, это приведет к утечке памяти.

класс QWidget

Хотя вы можете создать QWidget без родителя, вы не можете. Когда вы создаете экземпляр QWidget "без родителя" (т.е. Поставляя нулевой указатель или позволяя ему по умолчанию указывать нулевой указатель), его родительский элемент эффективно устанавливается в ваше приложение QApplication 1.

Есть ли способ получить такой список?

Нет. Причина QApplication::allWidgets() заключается в том, что все экземпляры QWidget имеют указатель на них, который хранится в вашем единственном экземпляре QApplication. Центрального хранилища указателей QObject нет, поэтому нет встроенного способа их извлечения.

Один из способов обеспечить то, что все экземпляры QObjects (или экземпляры классов, наследующие QObject) имеют действительный родитель. Затем вы можете использовать функции QObject children(), findChild() и findChildren(), чтобы получить указатели на эти объекты.

Это мощные инструменты, и, как и все мощные, используйте их с осторожностью! Убедитесь, что вы поняли жизненный цикл объекта С++, прежде чем использовать их в производственном коде.



Примечания:

  • QApplication наследует от QCoreApplication, который наследует от QObject. Существуют некоторые ограничения, размещенные на том, как QApplication используется каркасом Qt.