在 PyQt 应用程序中访问公共数据对象

Accessing a common data object in a PyQt application

我有一个用 PyQt 编写的 GUI,其中包含许多小部件和不同的 windows,等等。GUI 的数据存储在 python 对象中。该对象应该可以从程序中的每个小部件访问。我应该把这个对象放在哪里?

现在我在用于程序的主要 window 的 QMainWindow 实例中拥有它。问题是很难从深度嵌套的小部件中访问 QMainWindow 对象。为此使用 QApplication 实例似乎更简单,因为您可以使用 QtCore.QCoreApplication.instance() 获取它(如此 answer 所示)。但是,我找不到任何其他示例鼓励您更改 QApplication class,所以我想知道它是否真的应该那样使用。

您建议采用哪种方法?

正确的做法是将这个data/settings对象放在一个单独的模块中。然后可以在需要的地方简单地导入它。理想情况下,模块(以及创建 data/settings 对象的代码)应该在很大程度上独立于应用程序的其余部分。

将 data/settings 对象绑定到应用程序实例没有实际价值,因为您仍然必须导入 QApplicationqApp 才能访问它。同样的事情也适用于 QMainWindow - 它只是将问题移到不同的位置,并添加了一个不必要的间接层。这种方法的另一个大问题是 data/settings 对象在应用程序实例或主 window 变得可用之前无法访问。很多时候,data/settings 对象在应用程序的各个部分的初始化过程中都需要,因此将其绑定到特定的 GUI 元素很容易导致循环依赖或其他排序问题。

我想这里的关键设计原则是 Loose Coupling:一旦您将 data/settings 对象与 GUI 分离,应用程序的其余部分就可以随时随地访问它。