传递Qt中两个或多个MainWindows(SDI应用程序)的值

时间:2013-09-13 05:54:26

标签: qt settings shared children qmainwindow

我正在使用Qt框架编写SDI(单文档界面)应用程序。

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

窗口2:

  1. 用户更改工具栏可见性(隐藏它)。
  2. 使用QSettings功能保存设置。
  3. 所有其他窗口(可以是用户想要的数量):

    1. 检测到Window 2保存了设置。
    2. 应用新设置。
    3. 我尝试了很多东西,例如使用SIGNALS / SLOTS,但我无法更改所有窗口,因为在我的应用程序中创建MainWindows的方式是这样的:

      窗口1创建窗口2:

      • 窗口2创建窗口3:

        • 窗口3创建窗口4:

          • 依旧......

      这意味着如果更改窗口3中的值,则只有窗口2将加载新设置。

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

1 个答案:

答案 0 :(得分:2)

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

有多种方法可以通知这些小部件有关更改的信息。我在下面列出了一些;这个清单并非详尽无遗,还有很多方法可以做到。

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

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

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