Russian Qt Forum

Qt => Общие вопросы => Тема начата: Joss от Август 12, 2009, 21:19



Название: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Joss от Август 12, 2009, 21:19
Думаю, как сделать правильно и красиво.

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

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

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


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Пантер от Август 12, 2009, 21:47
Самый лучший это сохранение при нажатии кнопки ОК или Применить. На счет уведомления, можно законнектить сигналы изменения виджетов виджетов на общий сигнал modified.


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Joss от Август 12, 2009, 22:09
Цитировать
На счет уведомления, можно законнектить сигналы изменения виджетов виджетов на общий сигнал modified.

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

Может быть я чего-то не понял, я еще слабо ориентируюсь в Qt.


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: break от Август 12, 2009, 23:08
Есть дополненительные компоненты для Qt от Trolltech - QtSolutions

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


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Пантер от Август 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()));


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


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


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Alex Custov от Август 13, 2009, 12:47
Спасибо, действительно!
А sender при этом будет у всех один и тот же? Т.е. в слоте, с которым связан modified(), сендером будет уже объект this, а не объект конкретного виджета, который выдал сигнал? Как в таком случае проводить идентификацию?

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


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: ритт от Август 13, 2009, 15:26
<off>
Самый лучший
зе вэри бэст? у нас "лучший" - это крайняя форма улучшения качества - лучше быть не может :)</off>

а мне нравится registerField визарда %)


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Пантер от Август 13, 2009, 16:39
Я имел ввиду самый лучший из предложенных топикстартером. :)


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Joss от Август 14, 2009, 00:04
sender - это указатель на объект, который испустил сигнал, как он может быть одним и тем же для набора виджетов? ;)

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

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


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: Alex Custov от Август 14, 2009, 01:42
sender - это указатель на объект, который испустил сигнал, как он может быть одним и тем же для набора виджетов? ;)

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

sender()-ом будет конкретный QCheckBox, который послал сигнал


Название: Re: QSettings, сигналы от виджетов, как все объединить?
Отправлено: ритт от Август 14, 2009, 01:43
оо...жду с нетерпением :)