Для начала важно понять разницу между классами 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 ++.
Примечания:
QApplication
наследуется отQCoreApplication
, который наследуется от QObject
.Есть некоторые ограничения на использование QApplication в инфраструктуре Qt.