Получить список всех объектов QObject, созданных в приложении - PullRequest
11 голосов
/ 26 февраля 2010

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

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

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

1 Ответ

10 голосов
/ 30 ноября 2011

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

class QObject

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

class QWidget

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

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

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

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

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



Примечания:

  1. QApplication наследуется отQCoreApplication, который наследуется от QObject.Есть некоторые ограничения на использование QApplication в инфраструктуре Qt.
...