Всем привет! Особенно гуру Qt. Подскажите правильный вектор.
Задача такая: в главном окне или в отдельном должно быть специальное поле (виджет), на котором могут быть добавлены произвольные виджеты (таблички, комбобоксы, радиокнопки и пр). Всё что касается расположения и типов этих виджетов + некоторые атрибуты должны быть описаны в отдельном файле-шаблоне (например xml, но не суть). Фишка в том, что этих файлов может быть много и пользователь должен иметь возможность добавлять новые и редактировать старые. При запуске программа сканирует папку с этими шаблонами и даёт пользователю список из которого он может выбрать нужный шаблон. При выборе шаблона на том специальном поле (виджете) нарисовываются все кнопочки-галочки как описано в шаблоне.
Quilodader использовать не получится т.к. нужна возможность добавлять новые gui-шаблоны. Единственное что приходит в голову - парсить xml и создавать виджеты вручную на ходу, но это кажется геморным очень. В принципе на крайний случай можно пересобирать весь проект и gui-шаблоны делать на QML т.к. пользователь подразымевается программист, но это самый безвыходный случай. Ещё важное требование - портабельность в т.ч. на Андроид в далёком будущем чтобы не пришлось всё с нуля писать.
Спасибо заранее
Qt динамическое создание GUI на базе неких шаблонов (Без пересборки программы)
Модератор: Модераторы разделов
-
- Сообщения: 992
- ОС: openSUSE
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Qt динамическое создание GUI на базе неких шаблонов
Я бы предложил QML, под него задача ложится вообще отлично, но пока оно ещё не совсем доделано. Нет стандартных контролов. Но как раз в вопросе портабелности наболее правильное решение, ибо в плане развития Qt, общая основа — QtQuick как для десктоп, так и для мобильной техники.
А вот чем QUiLoader не подходит — не понял. Загружаем произвольный UI файл и кидаем его в QWidget. Немного перефразируя код из примера:
где
./ui/my.ui — файл с описанием
ui->placeForUi — QWidget расположенный где-то на форме.
В чём проблема с добавлением новых шаблонов?
А вот чем 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 расположенный где-то на форме.
В чём проблема с добавлением новых шаблонов?
-
- Сообщения: 1205
- ОС: Debian Wheezy (amd64)
Re: Qt динамическое создание GUI на базе неких шаблонов
У меня был один проект в котором GUI строилось с использованием QWebBrowser. сам интерфейс подгружался из ресурсов в виде обычных связок html+css. Правда в качестве ссылок использовались так же и специальные для обработки самой программой.
Ни чего не мешает эти html+css хранить не в ресурсах на в файловой системе и добавлять по вкусу на ходу.
Но целесообразность такого подхода естественно зависит от целей и задач вашего проекта.
С этим аккуратнее. Есть проект по компиляции Qt-проектов на Android но он, на сколько я знаю, еще сыроват. И если брать его в расчет, опять же "как я понял", надо ориентироваться на QML.
ЗЫ В моем случае такая реализация была выбрана, чтоб штатный дизайнер/верстальщик мог давать готовый интерфейс не изучая ни чего нового.
Ни чего не мешает эти html+css хранить не в ресурсах на в файловой системе и добавлять по вкусу на ходу.
Но целесообразность такого подхода естественно зависит от целей и задач вашего проекта.
С этим аккуратнее. Есть проект по компиляции Qt-проектов на Android но он, на сколько я знаю, еще сыроват. И если брать его в расчет, опять же "как я понял", надо ориентироваться на QML.
ЗЫ В моем случае такая реализация была выбрана, чтоб штатный дизайнер/верстальщик мог давать готовый интерфейс не изучая ни чего нового.
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
-
- Сообщения: 992
- ОС: openSUSE
Re: Qt динамическое создание GUI на базе неких шаблонов
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 хранить не в ресурсах на в файловой системе и добавлять по вкусу на ходу.
Спасибо, идея вроде интересная.
Да, это тоже гуглил. С другой стороны этот проект если и дорастёт до андроида, то на тот момент Necessitas будет уже стабилен

Значит надо пробовать QML для начала.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Qt динамическое создание GUI на базе неких шаблонов
Да, QML будет наилучшим вариантом.
По поводу подключения слотов: либо QMetaObject::connectSlotsByName использовать, либо вручную по каким-то признакам (например, тот же QObject::objectName, но с собственными ухищрениями).
Ну, а сами контролы перечислять при помощи QObject::findChild/findChildren.
По поводу подключения слотов: либо QMetaObject::connectSlotsByName использовать, либо вручную по каким-то признакам (например, тот же QObject::objectName, но с собственными ухищрениями).
Ну, а сами контролы перечислять при помощи QObject::findChild/findChildren.
Спасибо сказали: