获取应用程序中创建的所有 QObject 的列表

发布于 2024-08-23 05:40:12 字数 180 浏览 6 评论 0原文

要获取应用程序中创建的所有 QWidget 的列表,我们只需调用 QApplication::allWidgets() 即可。

我已阅读文档,但没有找到类似的内容来获取所有 QObject 的列表。如果应用程序创建不是 QWidget 的独立 QObject,我没有这样的函数可以使用。

有没有办法获得这样的列表?

To get a list of all the QWidgets created in an application we can simply call QApplication::allWidgets().

I've read the documentation, and I haven't found anything like this to get a list of all QObjects. If an application creates stand-alone QObjects that are not QWidgets I have no such function to use.

Is there a method to obtain such a list?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泼猴你往哪里跑 2024-08-30 05:40:12

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

QObject 类

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

class QWidget

虽然看起来您可以创建没有父级的 QWidget,但实际上您不能。当您创建“没有父级”的 QWidget 实例时(即通过提供空指针或让它默认为空指针),它的父级实际上被设置为应用程序的 QApplication1 实例。

有没有办法获取这样的列表?

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

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

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


注意:

  1. QApplication继承自QCoreApplication,而QCoreApplication又继承于QObject。 Qt 框架如何使用 QApplication 有一些限制

To begin with it's important to understand the difference between the QObject and QWidget classes.

class QObject

QObject instances have a pointer to their parent which may or may not be a null pointer. It's quite legitimate to create a QObject instance without a parent so long as you understand that it is your responsibility for that instance's lifetime i.e. if you don't delete it you will leak memory.

class QWidget

Although it appears you can create a QWidget without a parent, you can't. When you create an instance of a QWidget "without a parent" (i.e. by supplying a null pointer or letting it default to a null pointer) it's parent effectively gets set to your application's QApplication1 instance.

Is there a method to obtain such a list?

No. The reason QApplication::allWidgets() works is due to the fact that all QWidget instances have a pointer to them which is stored in your single QApplication instance. There is no central store of QObject pointers and therefore no in-built way of retrieving them.

One way around this is to ensure yourself that all QObjects instances (or instances of classes which inherit QObject) have a valid parent. Then you can use the QObject functions children(), findChild() and findChildren() to get pointers to these objects.

These are powerful tools, and like anything powerful, use them with care! Make sure you understand C++ object life spans before you use these in production code.


Notes:

  1. QApplication inherits from QCoreApplication which inherits from QObject. There are some restrictions placed on how QApplication is used by the Qt framework.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文