Russian Qt Forum
Ноябрь 26, 2024, 02:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSettings, сигналы от виджетов, как все объединить?  (Прочитано 7791 раз)
Joss
Гость
« : Август 12, 2009, 21:19 »

Думаю, как сделать правильно и красиво.

Есть в программе панель настроек, несколько десятков элементов (чекбоксы, радиобатоны, строки ввода и т.д.).
Программа должна уметь:

1. Сохранять настройки элементов через QSettings (тут два варианта - сохранять сразу после изменения элемента, или же перед выходом - первый чуть более медленный, но более надежный).
2. Читать настройки из ini-файла при запуске с помощью QSettings;
3. Уведомлять... ну, допустим, внутренний "контроллер" о том, что изменились какие-то настройки.

Как сделать все это не создавая множество слотов, не прописывая connect для каждого элемента, не создавая бесконечных if..else и т.д.?
Может быть поделитесь мыслями, как Вы реализовывали данную функциональность?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 12, 2009, 21:47 »

Самый лучший это сохранение при нажатии кнопки ОК или Применить. На счет уведомления, можно законнектить сигналы изменения виджетов виджетов на общий сигнал modified.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Joss
Гость
« Ответ #2 : Август 12, 2009, 22:09 »

Цитировать
На счет уведомления, можно законнектить сигналы изменения виджетов виджетов на общий сигнал modified.

Благодарю, но я не совсем понял - это все прописывается в коде? Или возможно через QtCreator соединить? Потому что в первом случае - можно просто соединить все с одним слотом и в нем уже получать информацию о sender.

Может быть я чего-то не понял, я еще слабо ориентируюсь в Qt.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Август 12, 2009, 23:08 »

Есть дополненительные компоненты для Qt от Trolltech - QtSolutions

Там есть "QPropertyBrowser" и с ним QProperty и наследники от него. Браузер бывает деревом, кнопочным и в виде групп - при этом сами данные хранятся в пропертях в иерархической структуре. То есть есть проперти родительское, есть дочерние уже конкретные значения или группы кот. в кнопочном браузере свойств "вываливаются" при нажатии кнопочки в названием группы (до этого не видны). И обходить их для сохранения будет удобно - просто написать иерархическую функцию обхода свойств и записи в файл (даже через тот же QSettings) .
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Август 13, 2009, 06:39 »

Цитировать
На счет уведомления, можно законнектить сигналы изменения виджетов виджетов на общий сигнал modified.

Благодарю, но я не совсем понял - это все прописывается в коде? Или возможно через QtCreator соединить? Потому что в первом случае - можно просто соединить все с одним слотом и в нем уже получать информацию о sender.

Может быть я чего-то не понял, я еще слабо ориентируюсь в Qt.
В коде, но можно сократить запись, допустим так:
Код
C++ (Qt)
QList<QCheckBox*> checkBoxList = this->findChildren<QCheckBox*> ();
foreach(const QCheckBox* checkBox, checkBoxList)
       connect (checkBox, SIGNAL(stateChanged(int)), this, SIGNAL(modified()));
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Joss
Гость
« Ответ #5 : Август 13, 2009, 10:45 »

Спасибо, действительно!
А sender при этом будет у всех один и тот же? Т.е. в слоте, с которым связан modified(), сендером будет уже объект this, а не объект конкретного виджета, который выдал сигнал? Как в таком случае проводить идентификацию?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Август 13, 2009, 11:37 »

Не, там сендер не нужен. Зачем тебе знать что именно изменилось? Ты должен знать, что что-то изменилось. Вот по сигналу modified устанавливаешь переменную (свою) isModified = true и можешь активровать кнопку Применить. А вот по применить или ок пробегаешься по все контролам и сохраняешь их состояние.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Август 13, 2009, 12:47 »

Спасибо, действительно!
А sender при этом будет у всех один и тот же? Т.е. в слоте, с которым связан modified(), сендером будет уже объект this, а не объект конкретного виджета, который выдал сигнал? Как в таком случае проводить идентификацию?

sender - это указатель на объект, который испустил сигнал, как он может быть одним и тем же для набора виджетов? Подмигивающий
Записан
ритт
Гость
« Ответ #8 : Август 13, 2009, 15:26 »

<off>
Самый лучший
зе вэри бэст? у нас "лучший" - это крайняя форма улучшения качества - лучше быть не может Улыбающийся</off>

а мне нравится registerField визарда %)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Август 13, 2009, 16:39 »

Я имел ввиду самый лучший из предложенных топикстартером. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Joss
Гость
« Ответ #10 : Август 14, 2009, 00:04 »

sender - это указатель на объект, который испустил сигнал, как он может быть одним и тем же для набора виджетов? Подмигивающий

Т.е. в слоте, с которым связан сигнал modified(), сендер будет не this, а checkBox?
Код:
connect (checkBox, SIGNAL(stateChanged(int)), this, SIGNAL(modified())

Спасибо большое, друзья! Мне очень помогли советы.
Я сейчас пробую реализовать собственную архитектуру связки и представлю ее здесь завтра, буду благодарен за критику.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Август 14, 2009, 01:42 »

sender - это указатель на объект, который испустил сигнал, как он может быть одним и тем же для набора виджетов? Подмигивающий

Т.е. в слоте, с которым связан сигнал modified(), сендер будет не this, а checkBox?
Код:
connect (checkBox, SIGNAL(stateChanged(int)), this, SIGNAL(modified())

sender()-ом будет конкретный QCheckBox, который послал сигнал
Записан
ритт
Гость
« Ответ #12 : Август 14, 2009, 01:43 »

оо...жду с нетерпением Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 22.