Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка UI из другого UI
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt инструментарий
bobdva
Загрузить форму в runtime из ui-файла можно при помощи QUiLoader.
Есть два ui-файла, в одном описан один компонент, в другом компонент, в котором требуется использовать widget, описанный в первом файле.

Как это можно описать в соответствии c форматом ui-файла, и как это можно загрузить в runtime (без предкомпиляции ui в h/cpp)
ViGOur
Если я правильно понял по поводу 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
Цитата(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
Тогда нужны подробности, почему и прочее...
Litkevich Yuriy
bobdva, рекомендую сделать наипростейший проект и выложить его

P.S. Пожалуйста не цитируй сообщения целиком если они большие, выдели интерисующий текст и нажми "++ЦИТАТА"
bobdva
Цитата(ViGOur @ 2.10.2008, 22:54) *
Тогда нужны подробности, почему и прочее...

хочется иметь возможность изменять формы без необходимости перекомпиляции и при этом использовать компоненты несколько раз.
т.е. есть, например, simpleForm.ui - простая форма, которая должна быть использована как в simpleDialog1.ui, так и в simpleDialog2.ui, которые отличаются ещё между собой чем-то, но содержат одну и ту же simpleForm.
надеюсь понятно объяснил
Litkevich Yuriy
читай мой пост
bobdva
Цитата(Litkevich Yuriy @ 2.10.2008, 22:59) *
bobdva, рекомендую сделать наипростейший проект и выложить его

простейший проект, где из main.cpp грузится simpleForm.ui сделал - ибо всё просто, но как сделать именно с включением одного в ui внутрь другого, и уже его динамечески загрузить в runtime - не могу даже подступиться.
ViGOur
А не проще ли без ui файлов обойтись?
Все можно создавать и на лету, без ui файлов, описав лишь нужные действия в классах и не более того. :)
bobdva
Цитата(ViGOur @ 2.10.2008, 23:07) *
А не проще ли без ui файлов обойтись?

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

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

описание графических диалогов/форм/компонент
ViGOur
Посмотри пример: Calculator Builder Example.
Кажется то, что тебе нужно...
bobdva
Цитата(ViGOur @ 2.10.2008, 23:14) *
Кажется то, что тебе нужно...

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

Если и сейчас я не правильно понял, то пойду спать... :)
Litkevich Yuriy
bobdva, выкладывай исходники того что есть, суй в тэг [code=cpp][/code] будем смотреть, подскажим
bobdva
Цитата(ViGOur @ 2.10.2008, 23:29) *
Если я правильно понял тебя сайчас, то тебе нужно загрузить сразу два ui, как в примере. И при загрузке второго ui в качестве родителя указать виджет из первого ui.

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

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

уже почти сделал, но есть некоторые шероховатости - как доделаю - выложу код.
и всем спасибо :D
ViGOur
Цитата(bobdva @ 3.10.2008, 15:26) *
как доделаю - выложу код.
Будем ждать.
А если его немного оформишь описанием, то можно выложить на сайт в раздел Qt Исходники... ;)
Litkevich Yuriy
ViGOur, лучше в вику
ViGOur
Цитата(Litkevich Yuriy @ 3.10.2008, 15:50) *
ViGOur, лучше в вику
Смотря как будет оформлено, в виде статьи в вику в виде исходников с их описание на сайт...
bobdva
Цитата(ViGOur @ 3.10.2008, 15:32) *
Цитата(bobdva @ 3.10.2008, 15:26) *
как доделаю - выложу код.
Будем ждать.
А если его немного оформишь описанием, то можно выложить на сайт в раздел Qt Исходники... ;)

уф... что-то вот наклепал и выложил у себя в блог:
Qt4: dynamic loading ui from an other ui
жду комментарии и замечания, и наверно можно будет в более лучшем виде положить в раздел Qt Исходники
Litkevich Yuriy
исходники можно на сайт, а статью можно в вику, и ссылку на сайт где исходнки. В вике можно писать неспеша в своей песочнице.

тему разделил свой custom widget
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.