LINUX.ORG.RU

[qt] Сохранение/восстановление ввода в GUI


0

1

tl;dr - как сделать сохранение пользователського ввода в GUI между перезапусками программы?

------------
Пусть окно некоторой программы организовано в несколько вкладок с инпутами, в основном флажки, (радио)кнопки и поля ввода для текста и чисел, а также слайдеры и несколько таблиц. И положим, есть человек, который заполнив все необходимые поля и таблицы и уставив флажки, хотел бы видеть результаты своего труда и после перезапуска программы. Для решения такой банальной задачки есть минимум 3 способа:

1) Используя QSettings API, вручную сохранять и восстанавливать все неообходмые поля по отдельности. Учитывая что параметров, которые нужно таким образом сохранять/восстанавливать, весьма много, этот подход мне не нравится, во всяком случае, до тех пор, пока мне не платят за число строк.

2) Использовать QFormBuilder из libQtDesigner, с помощью методов load()/save() которого можно организовать некое подобие персистентности GUI в целом, во всяком случае в теории, на практике же вёрстанный мною GUI сохраняется неправильно, вложенные layout'ы 2-го и высших уровней «пропадают» и в результате контролы сидят друг на друге.

3) Написать (самому?) некий реккурентный траверс дерева виджетов с интроспекцией и сохранением/восстановлением нужных свойств в зависимости от типа виджета (у полей ввода - текст или числовое значение, у кнопок и чеков - состояние, у таблиц и списков - массивы строк и т.д.). Не то чтобы это было невыполнимо, но есть дела и поинтереснее.

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

★★★★★

1.

...этот подход мне не нравится, во всяком случае, до тех пор, пока мне не платят за число строк.

А за что тебе платят? Странный критерий вообще-то, за число строк никогда не платят.

UVV ★★★★★ ()

Эмм, интроспекция кой какая в Qt есть, как я помню? Следовательно достаточно после создания формы зарегистрировать нужное свойство компонента в системе хранения, и та уже сама проследить за загрузкой значений, и их сохранением при необходимости.

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

Белк, ты гений. Правда теперь я не смогу стучать себя пяткой в грудь и говорить, что интроспекция в C++ не нужна.

KblCb ★★★★★ ()
Ответ на: комментарий от KblCb

Но я бы хотел посмотреть как сия проблема решается в различных проектах. Ибо на яве для предложенного способа пришлось писать систему хранения настроек, систему биндинга, и систему сериализации сложных объектов в текстовое представление. В итоге:

Prefs root = Preferencer.root();
guiPrefs = root.node("gui").node(getClass().getName());
//и теперь для каждого свойства
guiPrefs.bind("optionsButton", optionsButton, "selected");
guiPrefs.bind("window", this, "bound"); //а тут одной строкой размер и положение

И его еще надо немного доработать

wfrr ★★☆ ()
Ответ на: комментарий от wfrr

В Qt имеется QSettings. Он по сути и есть система хранения настроек (причём в родном формате системы, например в виндах - сразу в реестре) и сериализации/десериализации объектов. Но в него нужно вносить изменения (и читать из него) руками.

KblCb ★★★★★ ()

Я слишком ленивый, чтобы не сделать 3)

zJes ★★ ()

>3) Написать (самому?) некий реккурентный траверс дерева виджетов с интроспекцией и сохранением/восстановлением нужных свойств в зависимости от типа виджета (у полей ввода - текст или числовое значение, у кнопок и чеков - состояние, у таблиц и списков - массивы строк и т.д.). Не то чтобы это было невыполнимо, но есть дела и поинтереснее.

По правде это проще всего.

anonymous ()
Ответ на: комментарий от d_a

Копипаста - это всего лишь один из вариантов.

Не работай с виджетами, это дельфи-вей. Работай с моделью.

yoghurt ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.