10

要获取应用程序中创建的所有 QWidget 的列表,我们可以简单地调用QApplication::allWidgets().

我已经阅读了文档,但我还没有找到类似的东西来获取所有 QObjects 的列表。如果一个应用程序创建了不是 QWidgets 的独立 QObjects,我就没有这样的功能可以使用。

有没有办法获得这样的名单?

4

1 回答 1

11

首先,了解QObjectQWidget类之间的区别很重要。

类 QObject

QObject 实例有一个指向其父级的指针,该指针可能是也可能不是空指针。创建一个没有父级的 QObject 实例是非常合法的,只要您了解您对该实例的生命周期负责,即如果您不这样做delete,您将泄漏内存。

QWidget 类

尽管看起来您可以在没有父级的情况下创建 QWidget,但您不能。当您创建“没有父级”的 QWidget 实例时(即通过提供空指针或让它默认为空指针),它的父级有效地设置为您的应用程序的 QApplication 1实例。

有没有办法获得这样的名单?

不。原因QApplication::allWidgets()是因为所有 QWidget 实例都有一个指向它们的指针,该指针存储在您的单个 QApplication 实例中。没有 QObject 指针的中央存储,因此没有内置的方法来检索它们。

解决这个问题的一种方法是确保所有QObjects实例(或继承 QObject 的类的实例)都有一个有效的父级。然后您可以使用 QObject 函数children()findChild()findChildren()来获取指向这些对象的指针。

这些是强大的工具,就像任何强大的工具一样,小心使用它们!在生产代码中使用它们之前,请确保您了解 C++ 对象的生命周期。



笔记:

  1. QApplication继承自QCoreApplication继承自QObject。Qt 框架如何使用 QApplication有一些限制
于 2011-11-30T16:09:05.153 回答