0

我正在使用 Qt 框架编写一个 SDI(单文档接口)应用程序。

我目前遇到一个“小”问题:如果我在一个 MainWindow 中更改首选项,我希望同一 MainWindow 的所有其他实例都加载该首选项,例如:

窗口 2:

  1. 用户更改工具栏的可见性(隐藏它)。
  2. 使用 QSettings 功能保存设置。

所有其他窗口(可以根据用户的需要设置):

  1. 检测到 Window 2 保存了设置。
  2. 应用新设置。

我尝试了很多事情,例如使用 SIGNALS/SLOTS,但我无法更改所有窗口,因为在我的应用程序中创建 MainWindows 的方式是这样的:

窗口 1 创建窗口 2:

  • 窗口 2 创建窗口 3:

    • 窗口 3 创建窗口 4:

      • 等等...

这意味着如果在 Window 3 中更改值,则只有 Window 2 会加载新设置。

你知道这样做的方法(如何将值传递给窗口的所有孩子(和父母))?

4

1 回答 1

2

您可以使用QApplication::topLevelWidgets()来获取顶级小部件(窗口)的列表。你会这样称呼它:qApp->topLevelWidgets().

有多种方法可以通知这些小部件有关更改。我在下面列出了其中一些;该列表绝不是详尽无遗的,还有更多方法可以做到这一点。

  1. 您可以使用 aQObject将您的设置存储在动态属性中。您可以在任何属性更改时发出信号。重新实现QObject::event()以处理QDynamicPropertyChangeEvent对象在动态属性更改时将接收到的问题。每当更改属性时,您都可以简单地将其存储在 QSettings 中。对象的初始属性值可以在构造时从 QSettings 中检索。

  2. 每当您更改设置时手动发出信号,并在创建时将其连接到每个 SDI 窗口。这不需要使用该topLevelWidgets()方法。

  3. 使用自定义模型,例如派生自QAbstractListModel,并将您的窗口附加到dataChanged模型的信号。

于 2013-09-13T06:16:08.483 回答