Russian Qt Forum
Ноябрь 23, 2024, 15:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Скриптовый динамический ГУИ билдер. Есть такой?  (Прочитано 16030 раз)
niXman
Гость
« : Декабрь 02, 2009, 18:26 »

Хай.

Есть реальная необходимость строить ГУЙ из некоего скрипта/шаблона/правила.

Т.е. есть код. Написан руками. Т.е. объекты - сигналы/слоты. Нужно часто менять внешний вид ГУИ. Постоянно редактировать формы дизайнером не дело, т.к. нужно перекомпилировать программу.

Я вижу решение этой задачи весьма простым(если чего-то не упустил. что возможно). Разработать синтаксис файла-дизайна, парсер, билдер.

пример скрипта:
Код
XML
form.button1(pos, xsize, ysize, other_attributes...)[signal_name, receiver, slot_name]
 

так же есть класс:
Код
C++ (Qt)
class Main: public QDialog {
  Q_OBJECT
public:
  ...
public slots:
  void slot_name();
};
 

пример использования.
Код
C++ (Qt)
int main(...) {
  ...
  Main* m = new Main;
  parser* p = new parser("filename");
  ...
}
 

принцип работы парсера/билдера:
1. классы, к которым парсер будет коннектить сигналы/слоты, должны быть созданы раньше него.
2. в скрипте, поле "receiver", содержит реальное имя класса.
3. в скрипте, поле "slot_name", содержит реальное имя слота декларированного в классе "receiver".

как-то так Подмигивающий

Есть ли что-то подобное уже написанное?

Если нет, буду писать.
Интересует, что я не учел? Какие "подводные камни" могут встретится? И вообще мнение компетентных в этом вопросе людей.

Всем спасибо.
Записан
MoPDoBoPoT
Гость
« Ответ #1 : Декабрь 02, 2009, 18:45 »

Постоянно редактировать формы дизайнером не дело, т.к. нужно перекомпилировать программу.
Неа, не обязательно компилить  Улыбающийся
ссылка
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 02, 2009, 18:58 »

Многое зависит от того "кто и как будет этим пользоваться" и что значит "менять внешний вид UI"? Возникают ли новые параметры динамически? Если нет (или "почти нет"), то гораздо проще подсовывать разнообразные UI через QFormBuilder::load (введя какие-то соглашения по именам объектов).

У меня была такая задача: есть произвольная формула (вводимая пользователем), нужно ее "обсчитать" (детали не важны). Формула может иметь с десяток разнообразных параметров/коэффициентов которые нужно отобразить в UI и которые пользователь может менять. Я крутил с текстовыми ini файлами, примерно так:
Цитировать
[param]
name = Velocity;  // UI name
type = double;
min = 0;
max = 100;
UI = slider;          // UI control
...
 
Несмотря на простоту, писать пришлось довольно много Улыбающийся
Записан
niXman
Гость
« Ответ #3 : Декабрь 02, 2009, 19:08 »

Цитировать
Возникают ли новые параметры динамически?
Да. Но только визуальные.

Про предложения: все понятно, кроме одного, как быть с сигналами-слотами. В обоих предложенных вариантах, не нашел ничего про это.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 02, 2009, 19:18 »

Цитировать
Возникают ли новые параметры динамически?
Да. Но только визуальные.
Не понимаю как это Улыбающийся То есть контролы которые не влияют на результат?

Про предложения: все понятно, кроме одного, как быть с сигналами-слотами. В обоих предложенных вариантах, не нашел ничего про это.
В дизайнере простые слот/сигналы задать не проблема. Или, используя какие-то соглашения по именам объектов (это неизбежно), связать после загрузки/создания.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Декабрь 02, 2009, 19:24 »

QtScript позволяет использовать все QObject-ы значит и QWidget -в нем можно создавать - синтаксис почти не поменяется...
Записан
niXman
Гость
« Ответ #6 : Декабрь 02, 2009, 19:26 »

Цитировать
То есть контролы которые не влияют на результат?
Набор контролов(в лучшем случае) меняться не будет. Меняться будет положение, размер, лэйоут, кэпшн, и т.д...
Записан
niXman
Гость
« Ответ #7 : Декабрь 02, 2009, 19:30 »

Цитировать
QtScript позволяет использовать все QObject-ы значит и QWidget -в нем можно создавать - синтаксис почти не поменяется...
никогда не использовал. попробую разобраться.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Декабрь 02, 2009, 22:59 »

связка qtScript + QUILoader. пример - калькулятор в qtdemo
Записан
SASA
Гость
« Ответ #9 : Декабрь 03, 2009, 13:14 »

Где-то в блогах тролей видел интересную статейку. Там говорилось как можно создавать классы Qt прямо в скрипте.
Например:
Код:
p = new QLabel
Для решения задачи можно герить скрипт, а потом его выполнить.

QScript - мощная штука, если научиться переносить объекты С++ в скрипт.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #10 : Декабрь 03, 2009, 13:53 »

Цитировать
Там говорилось как можно создавать классы Qt прямо в скрипте.
Да прям в документации и говорится
Записан
ax
Чайник
*
Offline Offline

Сообщений: 60


Просмотр профиля
« Ответ #11 : Декабрь 03, 2009, 17:07 »

посмотри на Qt Script Generator

(http://qt.gitorious.org/qt-labs/qtscriptgenerator

делает практически все qt классы доступными в QtScript.
тамже есть примеры использования.

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Декабрь 03, 2009, 17:17 »

Есть такой проект Declarative UI у тролей, QML  и т.п., про них надо читать
Записан

Юра.
Lestat
Гость
« Ответ #13 : Декабрь 04, 2009, 21:16 »

Я для этих задач влепил в С++ код интерпретатор питона.
Рассчитывал связать PyQt со своей прогой, но не получилось, т.к. разные механизмы встраивания питона и обертки PyQt использовались.
Вот жду когда замутят PySide под винду... она вроде на Boost.Python, я как раз его юзал для заворачивания своих объектов.
Записан
spirits25
Гость
« Ответ #14 : Январь 11, 2012, 17:08 »

Затрагивая старое. Проблема вот в чём, есть много кнопок (создаются динамически), вызывающих один слот. Как определить какая из них вызвала его? как при коннекте связать с кнопкой какой-то парамерт (строку). для каждой кнопки слот создавать не вариант, так как всё динамически делается. Может в connect можно параметр как-то добавить?
ЗЫ пишу на pyside.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.139 секунд. Запросов: 23.