Передайте значения из двух или более MainWindows (приложение SDI) в Qt

Я пишу приложение SDI (Single Document Interface) с фреймворком Qt.

В настоящее время я столкнулся с «небольшой» проблемой: если я изменю предпочтение в одном MainWindow, я бы хотел, чтобы все остальные экземпляры того же MainWindow загружали это предпочтение, скажем:

Окно 2:

  1. Пользователь изменяет видимость панели инструментов (скрывает ее).
  2. Настройки сохраняются с помощью функции QSettings.

Все остальные окна (их может быть столько, сколько пожелает пользователь):

  1. Обнаружить, что окно 2 сохранило настройки.
  2. Примените новые настройки.

Я пробовал много вещей, таких как использование SIGNALS/SLOTS, но я не могу изменить все окна, потому что способ создания MainWindows в моем приложении таков:

Окно 1 создает Окно 2:

  • Окно 2 создает Окно 3:

    • Окно 3 создает Окно 4:

      • And so on...

Это означает, что если изменить значение в окне 3, только окно 2 загрузит новые настройки.

Знаете ли вы, как это сделать (как передать значения всем дочерним элементам (и родителям) окна)?


person Alex Spataru    schedule 13.09.2013    source источник
comment
Вы можете найти пример того, как я решил эту проблему здесь.   -  person Alex Spataru    schedule 16.09.2013


Ответы (1)


Вы можете использовать QApplication::topLevelWidgets() для получения списка виджетов верхнего уровня (окна). Вы бы назвали это так: qApp->topLevelWidgets().

Есть несколько способов уведомить эти виджеты об изменениях. Я перечислил некоторые из них ниже; список ни в коем случае не является исчерпывающим, есть еще много способов сделать это.

  1. Вы можете использовать QObject для хранения настроек в динамических свойствах. Вы можете излучать сигнал при изменении любого свойства. Переопределите QObject::event() для обработки QDynamicPropertyChangeEvent, которую объект будет получать при каждом изменении динамического свойства. Всякий раз, когда свойство изменяется, вы можете просто сохранить его в QSettings. Начальные значения свойств объекта могут быть получены из QSettings при построении.

  2. Подавайте сигнал вручную всякий раз, когда вы меняете настройки, и подключайте его к каждому окну SDI в момент его создания. Это не требует использования метода topLevelWidgets().

  3. Используйте пользовательскую модель, скажем, производную от QAbstractListModel, и прикрепите свои окна к сигналу dataChanged модели.

person Kuba hasn't forgotten Monica    schedule 13.09.2013
comment
Привет, я загрузил пример того, как я соединил сигналы и слоты между всеми MainWindows здесь. - person Alex Spataru; 16.09.2013