Название: Генерация кода из ui. Отправлено: Bepec от Декабрь 17, 2012, 14:37 Приветствую заглянувших.
Поматалыкался я немного с жуткими интерфейсами с меню тройной вложенностью и осенила меня мысль. А потом появился и вопрос. Имеются ли средства для генерации кода по ui файлу? Простой поиск по инету ничего похожего не дал, но ведь идея то неплоха. Сделав интерфейс в Qt Designer'e, получить на выходе болванку класса с необходимыми тебе связаными функциями и форматированием. Название: Re: Генерация кода из ui. Отправлено: Kurles от Декабрь 17, 2012, 14:44 Дык QtDesigner этим сам и занимается, не? Для русской версии - Форма - Показать код.
Название: Re: Генерация кода из ui. Отправлено: vizir1989 от Декабрь 17, 2012, 14:53 вообще Qt создает код.
при компиляции создается файл ui_<название ui формы>.h Там весь код хранится. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 17, 2012, 14:54 Не в том смысле, что просто код формы для динамического создания - нет.
А в смысле аля сделал меню с 3 уровнем вложенностью и десятками кнопок. А после генерации получил класс-наследника от QMainWindow с слотами, связанными с этими компонентами, с красивыми комментариями аля Код: //Файл|Получить изображение|С устройства Чисто механические действия - создание слотов, связывание слотов с виджетами. Чтобы это сделать нид как минимум помудохаться минут 5-10. Что в свою очередь не очень гуд. PS мысль свою выразил я понятно? или нет? PPS спасибо за ответы, но немного не то. Это я уже знал :) Название: Re: Генерация кода из ui. Отправлено: Patrin Andrey от Декабрь 17, 2012, 22:09 Нет, не понятно. Правой кнопкой на элемент->"перейти к слоту" это надо?
Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 17, 2012, 23:10 Господин Patrin Andrey я говорю о Designer. Не путайте о его интеграции в креаторе, о которой вы, по всей видимости, говорите :)
Хотя по смыслу наверно похоже (в креаторе не работал). Посмотрел - да, в принципе оно. Но. тыкать в меню/подменю/подменю из подменю это ... Сами поймете думаю :) Т.е. утилиты такой нет походу, окромя её жалкого подобия в креаторе. Жаль, очень жаль. PS Жалкое потому, что нельзя "перейти к слоту" action'a, нельзя выделить группой, нельзя... много чего нельзя. Но самый главный минус - привязанность к креатору :D Название: Re: Генерация кода из ui. Отправлено: carrygun от Декабрь 18, 2012, 05:15 Action'ы вполне можно создавать в дизайнере и переходить к их слотам.
Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 18, 2012, 06:50 Я с налёту не смог. Но в любом случае по одному щелкать не вариант :)
Название: Re: Генерация кода из ui. Отправлено: lit-uriy от Декабрь 19, 2012, 09:32 uic file.ui outfile.h
Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 09:45 lit-uriy почитайте тему. Пожааалуйста.
PS ну или хотя бы 4 сообщение. Название: Re: Генерация кода из ui. Отправлено: kuzulis от Декабрь 19, 2012, 10:27 Верес, нет, нету такой возможности о которой ты говоришь...
ЗЫ: Может тебе нужно, чтобы оно еще спело и станцевало? :) Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 10:37 Прощупываю почву для создания.
Для себя то я уже скриптик сделал вполне приличный, правда только до второго уровня вложенности и без вложенных комментариев :) Мне б лучше, если б оно ещё и водить умело :D PS очень кстати круто заляпать меню, навесить картинки и... И через 3 секунды получить код для вставки, связанный со всеми необходимыми сигналами :D Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 19, 2012, 10:40 Нда.
Такие системы лучше обслуживаются метаданными. У меня свыше 700 не системных-пользовательских пунктов в меню + пол сотни системных. Мне даже пришлось поисковую систему сделать, показывающую где в каком меню нужный объект висит. Разумеется с возможностью запуска из поиска. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 10:44 У вас уже промышленный масштаб серьёзной системы :)
А серьёзные системы требуют серьёзных подходов. А как у вас реализованы вызовы пунктов? Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 19, 2012, 10:47 Прощупываю почву для создания. В 1С есть такой проект OpenConf. Там один мастер внедрил в среду разработки скриптовую систему, обвязал объекты среды разработки в COM-оболочку и сделал доступными их через скрипты. Парни столько скриптов понаписали - интеллиценз, вимкомплит, куча конструкторов на все случаи жизни.Для себя то я уже скриптик сделал вполне приличный, правда только до второго уровня вложенности и без вложенных комментариев :) Мне б лучше, если б оно ещё и водить умело :D PS очень кстати круто заляпать меню, навесить картинки и... И через 3 секунды получить код для вставки, связанный со всеми необходимыми сигналами :D Разработка упростилась в разы. Чего и вам желаю. Т.е. писануть скрипт который парсит xml файл ui и *.cpp и *.h файлы и добавить в них вызовы, переменные и слоты вполне возможно. Надо бы в креаторе такую фичу замутить - сорцы то открыты. Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 19, 2012, 10:52 У вас уже промышленный масштаб серьёзной системы :) Элементарно запускается. В первой колонке путь к объекту: "Обработка.УправлениеНастройками1Спп32хх"А серьёзные системы требуют серьёзных подходов. А как у вас реализованы вызовы пунктов? Оборачиваешь в системную команду: ОткрытьФорму("Обработка.УправлениеНастройками1Спп32хх"); У меня правда реализовано с пом. доп обработки, которая сначала права на использование объекта запрашивает, а потом уже открывает. Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 19, 2012, 11:03 Я собственно и заморачиваюсь на системы типа http://www.prog.org.ru/topic_23822_0.html
Потому что знаю, любая система, введенная в эксплуатацию имеет шанс разрастись в монстра, управлять которым можно будет только с помощью специальных инструментов. Название: Re: Генерация кода из ui. Отправлено: Igors от Декабрь 19, 2012, 11:09 Bepec, я тут маленько пофлудю, надеюсь "частично в тему"
В добрые старые времена на Mac (когда еше никаким линухом и не пахло) все и всегда грузили диалоги из ресурсов. Диалог рисовался интерактивно, редакторы были - и не один. Загрузив диалог знали что контрол 1 - напр button, 2 - EditText и.т.д. Известны были только ID, по ним можно было взять handle контрола и дальше с ним самому разбираться. И все прекрасно работало, программист никаких трудностей не испытывал если руки у него росли как надо. А теперь - подайте то, принесите это. И текст сгенерите, и чтобы красиво оформлен, и попку подмойте.. В итоге - безрукое создание, умеющее только собирать, подключать и, по существу, ничего более. Зажрались. А ведь никто не мешает делать как раньше - есть QFormBuilder, и сигналы он хранит, и пропердии (не то что раньше - ID и все). Рисуйте себе в дизайнере на здоровье, потом только контролы в свои переменные загрузите. Чужой код (какой угодно хороший) всегда будет источником проблем по той простой причине что чужой. Его лучше не иметь. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 12:11 to panAlexey:
Хорошо, что у вас имеется готовая система :) Спасибо за пожелание. Одно плохо в идее с креатором - креатор :D (моё ИМХО) to Igors: В тему ваш флуд, в тему :) Я всё ждал когда это скажут - "пишите на ассемблере, а то превратились в тупых сборщиков из лего". Дело не в "красиво оформлено" и не в "подай принеси" и даже не в "зажрались" :) А дело в автоматизации рутинной работы :) Я ещё не дошёл до создания скриптового движка для связывания экшенов. Но необходимость обработать 20/30/40 пунктов меню заставляет подумать об автоматизации написания кода. 40 раз писать к примеру "void on_action_trippleKillEnemy_triggered(bool);" в h. А потом 40 раз в cpp. А потом ещё и держать в голове (или дополнительно 40 раз писать комментарии) где эти пункты находятся - как бы плохо. Igors - предложите другой способ написания обработчиков для action'ов и мы с вами его обсудим. Название: Re: Генерация кода из ui. Отправлено: kuzulis от Декабрь 19, 2012, 12:30 2 Верес,
блин, а я что-то до сих пор не въехал, зачем это надо... Т.е. ты хочешь, типа: набросал на UI контролы, назвал их как тебе нужно, жмакаеш некую магическую кнопочку "сделать мне волшебство" и на выходе получаешь класс... Но возникает вопрос, а откуда магическая кнопочка будет знать, на какие сигналы каких контролов генерить слоты? Ведь каждый контрол имеет сигналы, получается, что и слотов сгенерится туева хуча? Блин, я недогнал... Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 12:40 to kuzulis:
Собственно начало этой темы положили action'ы. У которых мне нужен был только один слот - нажатие. Т.е. набросал action'ы на QMenu в дизайнере, задал им имена. Сохранил ui. Врубил скриптип - чух мара пух - получаю кусок кода для h и cpp. И там и там имеются комментарии аля "//файл->открыть", обозначающие месторасположение контрола. Для примера и более полного понимания - вот жаба скриптик. Способ применения - задать ему в параметрах командной строки обрабатываемый ui. В ui должны быть action'ы. На выходе текстовый файлик test.txt создаваемый рядом со скриптом, содержащий в себе код. PS соответственно он работает на W7 64, а вот на линуксах как js запускать я и не подозреваю. PPS а вырасти это может, если запал не пропадёт, в довольно простую систему с выбором создаваемых слотов для групп контролов. Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 19, 2012, 13:48 А почему бы всё не упростить и вешать слоты не на каждый QAction, а один слот на один QMenu::triggered( QAction* action )?
Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 13:56 И получить один огромный смешанный свич? Который в конце концов сведётся к вызову функций, реализующих функционал?
Т.е. как я вижу, получается аля Код: switch (какой-то_признак) м? PS хотя в принципе и такое развитие событий возможно, создание по ui файлу данного свича. Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 19, 2012, 14:59 И получить один огромный смешанный свич? Который в конце концов сведётся к вызову функций, реализующих функционал? Почему огромный? У тебя что в меню огромное количество пунктов ??? Если > 20, то кривой дизайн.И в любом случае всё "сведётся к вызову функций, реализующих функционал". Цитировать switch (какой-то_признак) Привязываемся не к "какой-то_признак", к QAction::objectName().(кстати проще подключать на QMenuBar). Может и проще, только бессмысленно, ибо только определённое меню знает какой QAction был выбран.Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 15:08 А разве не написано, что только главное меню должно быть подписано на сигнал.
Да, меню огромное. > 20/30/40 с уровнем вложенности 3. Но. Мне даже из 10 пунктов будет приятнее видеть отдельные функции для реализации, чем одна большая. (мой юный и непосредственный взгляд ;)) Да, кривой дизайн. Дизайн не мой. Дизайн заказчика. Да, я бессилен в этом направлении. Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 19, 2012, 15:18 А разве не написано, что только главное меню должно быть подписано на сигнал. Где ???Цитировать Но. Мне даже из 10 пунктов будет приятнее видеть отдельные функции для реализации, чем одна большая. (мой юный и непосредственный взгляд ;)) Тебе в любом с лучае придётся писать туеву кучу слотов на каждый пункт. От этого никуда не деться.То, что я предлагаю, имхо, должно как раз упростить всё. Можно явным перебором по названию QAction, либо через QMetaObject::invokeMethod() опять же по имени QAction дергать определённый слот. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 15:25 made by assistant QMenuBar
Цитировать This signal is emitted when an action in a menu belonging to this menubar is triggered as a result of a mouse click; action is the action that caused the signal to be emitted. Normally, you connect each menu action to a single slot using QAction::triggered(), but sometimes you will want to connect several items to a single slot (most often if the user selects from an array). This signal is useful in such cases. Видимо мы не понимаем чуть друг друга. Последовательность моих действий: 1) создать QtGui класс, создать в ней меню из 5 action'ов. 2) запустить скрипт на ui. файл. 3) скопировать вывод в h, cpp. 4) реализовать функционал. Вот вывод уже готового скрипта, который я выкладывал ранее. Т.е. куева туча слотов создана, уже связана с формой. Мне остаётся только скопировать это в h, cpp и реализовать/объединить если необходимо функционал. Код: void on_action_triggered ( bool checked ); Название: Re: Генерация кода из ui. Отправлено: kambala от Декабрь 19, 2012, 15:29 3) скопировать вывод в h, cpp. хороший скрипт сам должен писать в файлы.я предпочитаю давать слотам норамальные названия, отражающие что они делают. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 15:34 Kambala, я ж произвёл все действия только что и исключительно для примера. Дабы прояснить все страсти.
Да, скрипт недоделанный. Да, он к тому же не умеет читать комментарии из-за UTF8. Да, я тоже предпочитаю давать нормальные названия. Да, я в js не очень силён. Даже скорее не то чтобы не силён, а просто идея реализации полноценной утилиты у меня пока на задворках сознания сидит. Да, я устал, разнервничался и хочу домой. Не придирайтесь к словам и примерам пожалуйста. Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 19, 2012, 15:36 Я говорю совсем про другое. Можно всё сделать автоматом непосредственно в самом приложении без всяких скриптов.
Достаточно чтобы меню имело уникальное название и элемент меню в рамках своего меню тоже имел уникальное название. Далее после создания QMenuBar-а и всех его подменю пробегаешься по всем подменю и вешаешь на каждое меню слот на QMenu::triggered( QAction* action ), в котором по имени меню и полученного action формируешь название слота и через QMetaObject::invokeMethod() вызываешь этот слот. Понятно? Название: Re: Генерация кода из ui. Отправлено: kuzulis от Декабрь 19, 2012, 15:51 Цитировать Понятно? Проще тебе написать мааленький примерчик, чем говорить, тогда уж точно все станет понятно. :)Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 15:53 Цитировать Re: Генерация кода из ui. К этому сообщению приложен скрипт. Времени его искать снова нет. Пользуйтесь.« Ответ #20 : Сегодня в 12:40 » Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 19, 2012, 18:38 Проще тебе написать мааленький примерчик, чем говорить, тогда уж точно все станет понятно. :) Да пожалуйста:Код
Подгружаемый mw.ui Код
Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 20:06 Два разных подхода.
В моём случае идёт простота, отсутствие обвязок, понятность, в комплекте нагруженные имена функций, В вашем идёт чтение ui (вы рассчитываете, что все ui будут лежать в пределах досягаемости ручек пользователя?), дополнительный класс - менеджер (прекрасно (не ирония, я о таком подходе не подумал), см. PPS), двойной вызов сигналов ( не критично ), связывание в конструкторе, невнятные (от моего незнания) манипуляции в main. Ваш пример можно доработать, ища не "все Qmenu", а используя только QMenuBar, как я уже писал, если верить ассистенту. Ваш подход ммм... скажем так непонятен начинающему (думаю начинающий повесится :D ) и довольно громоздок к условностям. Минимум в 3 местах надо будет иметь обвязку. Мой подход имеет же прост, основан на стандартном связывании и как раз, по моему мнению, подходит для разработки форм средней сложности средними программистами. PS снимаю перед вами шляпу - с помощью QUiLoader можно запепенить нормальную утилитку. Незнал, незнал. PPS ваш подход прекрасен для запутанных проектов. Думаю, чуть подправив, можно свести все Action'ы в этот класс менеджер. Вот только в большинстве случаев меню виджета должно выполнять с ним какие то действия. У вас же получается отвязка от самих виджетов и необходимость дополнительной обвязки в каждом из MainWindow и как следствие нарушение инкапсуляции. Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 19, 2012, 20:57 Вот уж не думал, что динамическая подгрузка *.ui будет так неоднозначно воспринята, тем более что это был всего-навсего пример.
В любом случае, мое дело предложить - твое отказаться. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 19, 2012, 21:02 Ну почему же - нормально. Но в любом случае :D Необходимо делать эти слоты вручную. А это как раз тупая моторика. Не требующий ума монотонный набор одинаковых функций и прочего :)
Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 20, 2012, 11:18 Можно еще один способ использовать:
1. Завести болванку под систему, которая реализует "общие" системные пункты, такие как обработка распространенного типа файлов - тесктовых, хтмл, или что там вашей софтине требуется, печать, вызов хелпа, управление окнами и т.д. и т.п. 2. Болванку под построение меняющихся интерфейсов. Т.е. туда, куда формы добавляются. Тут уже куча методов, от испоьзования уилоадеров до использования словаря метаданных. Я именно так и сделал. Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 20, 2012, 11:22 Ну почему же - нормально. Но в любом случае :D Необходимо делать эти слоты вручную. А это как раз тупая моторика. Не требующий ума монотонный набор одинаковых функций и прочего :) Если формам не нужны параметры, то я бы сделал мета-словарь, где перечислил путь к меню, имя файла формы и по ним создавал меню и связывал их с одним слотом мэпером. Можно и в QAction засунуть имя файла формы.Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 20, 2012, 11:37 panAlexey, разъясните мне пожалуйста концепцию болванки, а то чего й то не понимаю.
Просто в случае с словарём и прочими методами связь "пункта" и слота неочевидна и требуется обвязка. Повторюсь - для средних проектов. PS мне просто обвязки очень ненравятся. Ибо я то разберусь, а кому другому надо будет изменить/добавить, то ему придётся разбираться в обвязке и необходимом количестве условий для её выполнения. Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 20, 2012, 12:01 Ваш пример можно доработать, ища не "все Qmenu", а используя только QMenuBar, как я уже писал, если верить ассистенту. Дело в том, что если завязываться на QMenuBar::triggered( QAction* action ), то нам никак не узнать в каком именно меню выбрали пункт :(Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 20, 2012, 12:10 Почему?
Псевдокод Код: QMenu * menu = action.menu(); Название: Re: Генерация кода из ui. Отправлено: GreatSnake от Декабрь 20, 2012, 12:13 Неправ по всем параметрам.
Неужто ты думаешь, я не проверил все варианты перед тем как утверждать) Название: Re: Генерация кода из ui. Отправлено: panAlexey от Декабрь 20, 2012, 17:49 panAlexey, разъясните мне пожалуйста концепцию болванки, а то чего й то не понимаю. Да то же самое, что и наследование в ООП.Есть класс который может многое и многое делает, ты берешь его за основу и добавляешь свои функции. Название: Re: Генерация кода из ui. Отправлено: Bepec от Декабрь 20, 2012, 18:16 Не, болванки в этом случае не катят :) Слишком разный набор функций. Всё вместе собрать - получится крошево :D
|