Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt инструментарий _ Загрузка UI из другого UI

Автор: bobdva 2.10.2008, 21:21

Загрузить форму в runtime из ui-файла можно при помощи QUiLoader.
Есть два ui-файла, в одном описан один компонент, в другом компонент, в котором требуется использовать widget, описанный в первом файле.

Как это можно описать в соответствии c форматом ui-файла, и как это можно загрузить в runtime (без предкомпиляции ui в h/cpp)

Автор: ViGOur 2.10.2008, 21:40

Если я правильно понял по поводу QUiLoader в ассистенте, то это делается по аналогии с AnalogClock:

QWidget *loadCustomWidget(QWidget *parent)
{
     QUiLoader loader;
     QWidget *myWidget;

     QStringList availableWidgets = loader.availableWidgets();

     if (availableWidgets.contains("AnalogClock"))
         myWidget = loader.createWidget("AnalogClock", parent);

     return myWidget;
}

Автор: bobdva 2.10.2008, 21:43

Цитата(ViGOur @ 2.10.2008, 22:40) *
Если я правильно понял по поводу QUiLoader в ассистенте, то это делается по аналогии с AnalogClock:
QWidget *loadCustomWidget(QWidget *parent)
{
     QUiLoader loader;
     QWidget *myWidget;

     QStringList availableWidgets = loader.availableWidgets();

     if (availableWidgets.contains("AnalogClock"))
         myWidget = loader.createWidget("AnalogClock", parent);

     return myWidget;
}


в том-то и проблема, что требуемый widget не находится в availableWidgets :(

Автор: ViGOur 2.10.2008, 21:54

Тогда нужны подробности, почему и прочее...

Автор: Litkevich Yuriy 2.10.2008, 21:59

bobdva, рекомендую сделать наипростейший проект и выложить его

P.S. Пожалуйста не цитируй сообщения целиком если они большие, выдели интерисующий текст и нажми "++ЦИТАТА"

Автор: bobdva 2.10.2008, 22:00

Цитата(ViGOur @ 2.10.2008, 22:54) *
Тогда нужны подробности, почему и прочее...

хочется иметь возможность изменять формы без необходимости перекомпиляции и при этом использовать компоненты несколько раз.
т.е. есть, например, simpleForm.ui - простая форма, которая должна быть использована как в simpleDialog1.ui, так и в simpleDialog2.ui, которые отличаются ещё между собой чем-то, но содержат одну и ту же simpleForm.
надеюсь понятно объяснил

Автор: Litkevich Yuriy 2.10.2008, 22:01

читай мой пост

Автор: bobdva 2.10.2008, 22:02

Цитата(Litkevich Yuriy @ 2.10.2008, 22:59) *
bobdva, рекомендую сделать наипростейший проект и выложить его

простейший проект, где из main.cpp грузится simpleForm.ui сделал - ибо всё просто, но как сделать именно с включением одного в ui внутрь другого, и уже его динамечески загрузить в runtime - не могу даже подступиться.

Автор: ViGOur 2.10.2008, 22:07

А не проще ли без ui файлов обойтись?
Все можно создавать и на лету, без ui файлов, описав лишь нужные действия в классах и не более того. :)

Автор: bobdva 2.10.2008, 22:10

Цитата(ViGOur @ 2.10.2008, 23:07) *
А не проще ли без ui файлов обойтись?

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

Цитата(bobdva @ 2.10.2008, 23:09) *
требования, что описание должно быть внешним, которое можно как-то быстро менять (qt designer, например), а делать свой велосипед по загрузке этого внешнего описания не хотелось.

описание графических диалогов/форм/компонент

Автор: ViGOur 2.10.2008, 22:14

Посмотри пример: http://www.crossplatform.ru/documentation/qtdoc4.3/designer-calculatorbuilder.php.
Кажется то, что тебе нужно...

Автор: bobdva 2.10.2008, 22:19

Цитата(ViGOur @ 2.10.2008, 23:14) *
Кажется то, что тебе нужно...

извините, но нет, не то, что мне нужно - это только первый шаг по загрузке формы из ui файла. И это сделано и работает успешно.
Задача несколько по иному стоит - загрузить ui, в который загружается ещё один ui и это всё в runtime

Автор: ViGOur 2.10.2008, 22:29

Цитата(bobdva @ 2.10.2008, 23:19) *
загрузить ui, в который загружается ещё один ui и это всё в runtime
Извини, до этого не до конца понял, спать уже пора ложиться. :)
Если я правильно понял тебя сайчас, то тебе нужно загрузить сразу два ui, как в примере. И при загрузке второго ui в качестве родителя указать виджет из первого ui.

Если и сейчас я не правильно понял, то пойду спать... :)

Автор: Litkevich Yuriy 2.10.2008, 22:32

bobdva, выкладывай исходники того что есть, суй в тэг [code=cpp][/code] будем смотреть, подскажим

Автор: bobdva 3.10.2008, 10:15

Цитата(ViGOur @ 2.10.2008, 23:29) *
Если я правильно понял тебя сайчас, то тебе нужно загрузить сразу два ui, как в примере. И при загрузке второго ui в качестве родителя указать виджет из первого ui.

почти, но не совсем то.
Логика загрузки грузит только один ui - она не знает, будет ли он грузить другой ui, один ui, или вообще несколько.
хочется грубо говоря включения (include, но не include в терминах cpp/h) ui внутрь другого ui

Автор: Litkevich Yuriy 3.10.2008, 13:48

Цитата(bobdva @ 3.10.2008, 14:15) *
говоря включения (include, но не include в терминах cpp/h) ui внутрь другого ui
помоему непосредственно так сделать нельзя

Автор: bobdva 3.10.2008, 14:26

Цитата(Litkevich Yuriy @ 3.10.2008, 14:48) *
помоему непосредственно так сделать нельзя

да, судя по всему, стандартными средствами никак, но можно сделать свой компонент (расширяющий QWidget), который будет принимать св-во с указанием имени файла и вот уже его грузить через UiLoader

уже почти сделал, но есть некоторые шероховатости - как доделаю - выложу код.
и всем спасибо :D

Автор: ViGOur 3.10.2008, 14:32

Цитата(bobdva @ 3.10.2008, 15:26) *
как доделаю - выложу код.
Будем ждать.
А если его немного оформишь описанием, то можно выложить на сайт в раздел http://crossplatform.ru/?q=taxonomy/term/65... ;)

Автор: Litkevich Yuriy 3.10.2008, 14:50

ViGOur, лучше в вику

Автор: ViGOur 3.10.2008, 14:54

Цитата(Litkevich Yuriy @ 3.10.2008, 15:50) *
ViGOur, лучше в вику
Смотря как будет оформлено, в виде статьи в вику в виде исходников с их описание на сайт...

Автор: bobdva 3.10.2008, 15:41

Цитата(ViGOur @ 3.10.2008, 15:32) *
Цитата(bobdva @ 3.10.2008, 15:26) *
как доделаю - выложу код.
Будем ждать.
А если его немного оформишь описанием, то можно выложить на сайт в раздел http://crossplatform.ru/?q=taxonomy/term/65... ;)

уф... что-то вот наклепал и выложил у себя в блог:
http://dolzhenko.blogspot.com/2008/10/qt4-dynamic-loading-ui-from-other-ui.html
жду комментарии и замечания, и наверно можно будет в более лучшем виде положить в раздел http://crossplatform.ru/?q=taxonomy/term/65

Автор: Litkevich Yuriy 3.10.2008, 16:41

исходники можно на сайт, а статью можно в вику, и ссылку на сайт где исходнки. В вике можно писать неспеша в своей песочнице.

тему разделил http://www.forum.crossplatform.ru/index.php?showtopic=1399

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)