Название: Еще одно окно типа *.ui Отправлено: pupapum от Февраля 08, 2008, 12:48 Привет ребят. У меня есть окно типа QMainWindow, создананное как .ui и оно у меня главное. Я создал еще одно окно типа ui, но не могу разобраться как его запустить при запущенном первом. Можете привести исходники файлов .h и .cpp, как должен выглядеть класс этой формы. Извините, если мысли варажаю не очень понятно. =). Вторая форма наследуется от QMainWindow и имя у нее CodeInput.ui. Спасибо.
Название: Re: Еще одно окно типа *.ui Отправлено: Racheengel от Февраля 08, 2008, 13:48 у тебя второй класс называется CodeInput?
тогда где-нибудь в коде первой формы, пиши CodeUnput *form2 = new CodeUnput(this); // для создания form2->show(); // для отображения Название: Re: Еще одно окно типа *.ui Отправлено: Karl-Philipp от Февраля 08, 2008, 13:50 может я ошибаюсь, но сам делал так.
Во-первых, создавал класс, который наследует ui-класс и нужный класс (у меня - QDialog). Примерно это выглядит так: class PMD : public QDialog, private Ui::Dialog { ... }; Во-вторых, создал указатель на PMD класс и показывал его с помощью show() или прятал, соответсвенно - hide(); Название: Re: Еще одно окно типа *.ui Отправлено: vregess от Февраля 09, 2008, 07:35 может я ошибаюсь, но сам делал так. Возможно ты не ошибаешься. Вот более подробно:Во-первых, создавал класс, который наследует ui-класс и нужный класс (у меня - QDialog). Примерно это выглядит так: class PMD : public QDialog, private Ui::Dialog { ... }; Во-вторых, создал указатель на PMD класс и показывал его с помощью show() или прятал, соответсвенно - hide(); Код: // объявление и реализация класса Название: Re: Еще одно окно типа *.ui Отправлено: pupapum от Февраля 09, 2008, 13:35 спасибо, пробую...
Название: Re: Еще одно окно типа *.ui Отправлено: Dodge от Февраля 11, 2008, 17:09 + можно воспользоватся QUiLoader'ом:
Код: QUiLoader uiloader; ;D Название: Re: Еще одно окно типа *.ui Отправлено: Karl-Philipp от Февраля 12, 2008, 11:24 + можно воспользоватся QUiLoader'ом: Код: QUiLoader uiloader; ;D Dodge, можно и QUiLoader'ом. А если, например, нужно дописать какие-то методы к загружаемому интерфейсу (а методы точно придется дописывать, ведь созданная форма ui (в посте pupapum) наследует QMainWindow)? В предложеном Вами варианте нельзя же так сделать? Или я не прав? Название: Re: Еще одно окно типа *.ui Отправлено: Dodge от Февраля 12, 2008, 17:05 неправ :P
вся соль тут: Код: ... мы можем получить указатель на любой виджет через его парента, зная его objectName. Парента мы знаем, указатель на него возвращает QUiLoader. следовательно чтоб создать обработчик для кнопки "MyPushButton" делаем следуещее: 1. Делаем "класс функционала", в который обрабатывает все нужные события, в нашем случае - нажатие на кнобку Код: class MyClass : public QObject { далее: Код:
Собственно все. Такой способ проэктирования заставляет программиста, "оторват" функционал от gui, а это ИМХО есть - правильно. З.Ы. Вообще, с появлением модуля Qt Script все стало еще проще, если интересно я могу выложить несколько примеров создания приложения с исп динамической загрузки gui, при помощи скрипта. Название: Re: Еще одно окно типа *.ui Отправлено: Karl-Philipp от Февраля 12, 2008, 17:18 интересное решение :)
Кроме того, очень хотелось бы посмотреть на примеры создания приложения с исп динамической загрузки gui, при помощи скрипта. Выложите, пожалуйста. Название: Re: Еще одно окно типа *.ui Отправлено: Dodge от Февраля 13, 2008, 13:49 Как и обещал, привожу пример загрузки gui при помощи Qt Script.
Для начала нам нужно расширить базовые возможности Qt Script, и добавить ряд глобальных объектов, для более гибкого проектирования. Я написал небольшое расширение(ScriptEngine) для стандартного QScriptEngine, которое имеет рад особенностей: 1. Поддерживает систему плагинов. Это очень важно, т.к. это позволяет нам расширять функционал движка "на ходу". Т.е. если нам чегото не хватает, то мы это пишем и подгружаем(хоть в динамике). На данный момент мой движок поддерживает 2 типа плагинов: - статические; - контекстные; Их различие в том, что статический плагин может содержать в себе только набор некоторых функций, а контекстный, может еще содержать в себе некоторые классы, которые он(плагин) может зарегистрировать в контексте движка, и соответственно эти классы станут доступны непосредственно из скрипта. 2. Мультиконтекстность. Это значит что каждый скрипт, может выполнятся в своем независимом контексте. Ниже декларация движка: Код: class ScriptEngine : public QObject { Не буду углубляться в детали, скажу лиш то, что для постановки скрипта на выполнение требуется вызвать функцию executeEngine, которая принимает ряд аргументов: str - если имя файла, то выполняется файл, если нет, то интерпретируется как скрипт; args - аргументы, первый(если есть) - имя функции в скрипте, которую необходимо запустить, остальные параметры передаются как аргументы для данной функции; v - для отладки, нам не интересен. Допустим движок удовлетворяет нас своими возможностями, теперь нам необходим загрузщик ui - файлов. А так как в нашем движке есть интерфейс плагинов, загрузчик ui - файлов будет выполнен именно в виде плагина для движка. Интерфейс плагина: Код: class StaticModuleInterface { Выше я упоминал о 2 типах плагинов, но тут только 1, статический, контекстный нам пока и не нужен)) загрузчик ui - файлов: Код: class UiLoaderPlugin : В принципе если вы в ассистенте посмотрите класс QUiLoader, то особых отличий от вышеприведенного плагина не увидите, плагин выполняет роль транслятора функциональности класса QUiLoader, для движка. + 2 функции, которые будут полезны при работе с gui appExec - QApplication::exec() и appQuit - QApplication::quit(). Ну а далее все просто до безобразия: 1. Засовываем загрузщик ui - файлов в шаред либрари. 2. Пишем программку которая будет выполнять роль интерпретатора. Код: #include "ScriptEngine.h" 3. Нарисовать форму в дизайнере, и написать скрипт который будет ее подгружать. Собственно привожу уже заезженный пример загрузки окна с кнопкой(кнопка называется - myButton): Код:
Соответственно в функции myButtonClick может быть все что угодно. Также никто не мешает коннектить сигнал clicked кнопки к другим объектам, в том числе и плагинам/модулям движка. Приклеел исходники того что я тут втирал)) Название: Re: Еще одно окно типа *.ui Отправлено: ритт от Февраля 13, 2008, 14:47 эх...жаль, одмин не прикрутил вику - хороший материал для фака/триков
Название: Re: Еще одно окно типа *.ui Отправлено: Dodge от Февраля 13, 2008, 15:42 эх...жаль, одмин не прикрутил вику - хороший материал для фака/триков Впринципе согласен. На форуме есть некоторое количество материала которое хотелось бы видеть в виде структурированного мануала/пособия/фака. |