Qt динамическое создание GUI на базе неких шаблонов (Без пересборки программы)

Модератор: Модераторы разделов

Ответить
FlySnake
Сообщения: 992
ОС: openSUSE
Контактная информация:

Qt динамическое создание GUI на базе неких шаблонов

Сообщение FlySnake »

Всем привет! Особенно гуру Qt. Подскажите правильный вектор.
Задача такая: в главном окне или в отдельном должно быть специальное поле (виджет), на котором могут быть добавлены произвольные виджеты (таблички, комбобоксы, радиокнопки и пр). Всё что касается расположения и типов этих виджетов + некоторые атрибуты должны быть описаны в отдельном файле-шаблоне (например xml, но не суть). Фишка в том, что этих файлов может быть много и пользователь должен иметь возможность добавлять новые и редактировать старые. При запуске программа сканирует папку с этими шаблонами и даёт пользователю список из которого он может выбрать нужный шаблон. При выборе шаблона на том специальном поле (виджете) нарисовываются все кнопочки-галочки как описано в шаблоне.
Quilodader использовать не получится т.к. нужна возможность добавлять новые gui-шаблоны. Единственное что приходит в голову - парсить xml и создавать виджеты вручную на ходу, но это кажется геморным очень. В принципе на крайний случай можно пересобирать весь проект и gui-шаблоны делать на QML т.к. пользователь подразымевается программист, но это самый безвыходный случай. Ещё важное требование - портабельность в т.ч. на Андроид в далёком будущем чтобы не пришлось всё с нуля писать.
Спасибо заранее
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt динамическое создание GUI на базе неких шаблонов

Сообщение NickLion »

Я бы предложил QML, под него задача ложится вообще отлично, но пока оно ещё не совсем доделано. Нет стандартных контролов. Но как раз в вопросе портабелности наболее правильное решение, ибо в плане развития Qt, общая основа — QtQuick как для десктоп, так и для мобильной техники.

А вот чем QUiLoader не подходит — не понял. Загружаем произвольный UI файл и кидаем его в QWidget. Немного перефразируя код из примера:

Код: Выделить всё

     QUiLoader loader;
     QFile file("./ui/my.ui");
     file.open(QFile::ReadOnly);
     QWidget *myWidget = loader.load(&file, this);
     file.close();

     QVBoxLayout *layout = new QVBoxLayout;
     layout->addWidget(myWidget);
     ui->placeForUi->setLayout(layout);

где
./ui/my.ui — файл с описанием
ui->placeForUi — QWidget расположенный где-то на форме.
В чём проблема с добавлением новых шаблонов?
Спасибо сказали:
Аватара пользователя
Voral
Сообщения: 1205
ОС: Debian Wheezy (amd64)
Контактная информация:

Re: Qt динамическое создание GUI на базе неких шаблонов

Сообщение Voral »

У меня был один проект в котором GUI строилось с использованием QWebBrowser. сам интерфейс подгружался из ресурсов в виде обычных связок html+css. Правда в качестве ссылок использовались так же и специальные для обработки самой программой.
Ни чего не мешает эти html+css хранить не в ресурсах на в файловой системе и добавлять по вкусу на ходу.

Но целесообразность такого подхода естественно зависит от целей и задач вашего проекта.

FlySnake писал(а):
23.08.2012 03:07
Ещё важное требование - портабельность в т.ч. на Андроид в далёком будущем чтобы не пришлось всё с нуля писать.

С этим аккуратнее. Есть проект по компиляции Qt-проектов на Android но он, на сколько я знаю, еще сыроват. И если брать его в расчет, опять же "как я понял", надо ориентироваться на QML.


ЗЫ В моем случае такая реализация была выбрана, чтоб штатный дизайнер/верстальщик мог давать готовый интерфейс не изучая ни чего нового.
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE
Контактная информация:

Re: Qt динамическое создание GUI на базе неких шаблонов

Сообщение FlySnake »

NickLion писал(а):
23.08.2012 06:21
А вот чем QUiLoader не подходит — не понял. Загружаем произвольный UI файл и кидаем его в QWidget. Немного перефразируя код из примера:
...
где
./ui/my.ui — файл с описанием
ui->placeForUi — QWidget расположенный где-то на форме.
В чём проблема с добавлением новых шаблонов?

Я вообще не пробовал его, просто бегло гуглом и по документации пробежался и не до конца понял фичу. Проблема в том как приложение узнает о контролах и их сигналах на вновь созданной и загруженной форме? Или я туплю по-жёсткому?

Voral писал(а):
23.08.2012 10:16
У меня был один проект в котором GUI строилось с использованием QWebBrowser. сам интерфейс подгружался из ресурсов в виде обычных связок html+css. Правда в качестве ссылок использовались так же и специальные для обработки самой программой.
Ни чего не мешает эти html+css хранить не в ресурсах на в файловой системе и добавлять по вкусу на ходу.

Спасибо, идея вроде интересная.

Voral писал(а):
23.08.2012 10:16
С этим аккуратнее. Есть проект по компиляции Qt-проектов на Android но он, на сколько я знаю, еще сыроват. И если брать его в расчет, опять же "как я понял", надо ориентироваться на QML.

Да, это тоже гуглил. С другой стороны этот проект если и дорастёт до андроида, то на тот момент Necessitas будет уже стабилен :)

Значит надо пробовать QML для начала.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt динамическое создание GUI на базе неких шаблонов

Сообщение NickLion »

Да, QML будет наилучшим вариантом.

По поводу подключения слотов: либо QMetaObject::connectSlotsByName использовать, либо вручную по каким-то признакам (например, тот же QObject::objectName, но с собственными ухищрениями).
Ну, а сами контролы перечислять при помощи QObject::findChild/findChildren.
Спасибо сказали:
Ответить