Название: 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. Код
Название: 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 оо...жду с нетерпением :)
|