Hatred's Log Place

DON'T PANIC!

Feb 11, 2010 - 4 minute read - programming

Qt Creator и автоматическое создание реализации метода/прототипа

UPD: Информация больше не актуальна, теперь подобные средства кодогенерации встроены в Qt Creator.

Долгое время пользовался для написание программ, с использованием Qt4 интегрированную среду разработки QDevelop, и хотя она почти всем устраивает, за несколькими исключениями:

  • непонятно работает автодополнение
  • на 500 строках и больше начинает ощутимо поддтормаживать

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

  • написана только на Qt4
  • есть менеджер классов, через который можно создавать автоматически методы/переменные (для последних сразу можно создать get/set функцию, хотя вообще в этой реализации есть так же свои недоделки)
  • в браузере файлов, по щелчку правой кнопки мыши на файле формы, можно выбрать пункт Dialog Subclassing… в котором отобразятся все компоненты формы, и для них можно сразу создать обработчик, который автоматом пропишется в связанном классе.
  • при этом редактирование формы отдается Designer’у как внешней утилите, что для меня очень удобно (да и вообще - для небольших экранов)
  • при этом контекстная справка отравляет нас в Assistant, что опять таки, для меня очень удобно.
  • поддержка .pro, хоть и сказано, базовая, но через параметры проекта, в интуитивно понятной форме, можно управлять почти всем.

К сожалению факт, быстродействия и удобства написания кода, вынудил меня начать поиски другой IDE, и вот к чему они привели:

  • ни у одной IDE нет удобного менеджера классов:
    • Eclips/Netbeanse - вроде монстры, но не осилил, как там создать через мастер новый член класса
    • Monkey Studio 2 - аналогично, хотя бегать по классам умеет
    • Edyuk - только бегает по классам
  • Из вышеперечисленных только в Edyuk есть аналог Subclassing у QDevelop, и реализовано схожим образом, но, к сожалению - падуч он (версия из svn, а стабильная 1.1.0 тоже давно не обновлялась)

Итак, нарочно не упомянул о Qt Creator, хотя, вроде среда от разработчиков, должна рвать всех, но ннннннет: менеджера классов нет вообще.

Да, отчасти, при навигации, с лихвой хватает инструмента “Обзор” (вызывается Ctrl+K), но не для создания новых элементов. Рыба нового класса создается через Файл-Новый файл или проект… а далее разделы:

  • C++ / Класс C++
  • Qt / Класс формы Qt Designer (форма и связанный класс)

Аналога subclassing нет, но во встроенном редакторн формы, в контекстном меню, имеется пункт “Go to slot…”, но это требует открытия формы внутри Qt Creator (тут мой совет - Alt+0 ваш друг, что бы временно убрать боковую панель, и потом вернуть её обратно), а места там мало (или я один придурок, кодирую на своем Eee PC 1000? ;))

Возможности настройки .pro показались скупыми, но я тут, возможно, ещё не со всем разобрался.

При этом очень приятный код самого проекта, очень шустрое автодополнение.

Да, очень не хватает создания методов и членов класса через мастер, но тут же есть и плюсы - контролируется внешний вид лучше, форматирование, следование политикам кодирования. Поэтому все своё неудобство свел к следующему:

Неудобно вручную прописывать новый метод класса: нужно его прописать в объявлении класса, а потом ещё и в реализации

немного подумал, посмотрел на существующую функциональность (есть переход между объявлением/реализацией) и сформировал следующее:

Написать функциональность по автоматическому созданию реализации метода класса, если он не существует, при попытке перейти к нему. Аналогично, для прототипа функции и её реализации.

Из дополнительных требований:

  • реализация будет создана в файле, совпадающим с текущим по имени, за исключением последнего элемента расширения и расположенным в том же каталоге, что и текущий
  • реализация будет создана только в том случае, если целевой файл включает текущий (делается #include)
  • если реализации нет, выдавать вопрос - нужно ли создавать её или нет. Если нет - завершить обработку, если да - попытаться создать и перейти к целевому коду.

На пальцах: если прототип описан в .h файле, и рядом есть такой же .c/.cpp файл, который делает #include нашего .h файла и не содержит реализации (сиречь - мы имеет только описание функции), то при попытке перехода спрашиваем пользователя - нужно ли создавать реализацию, если да - создаем в конце файла шаблон функции и позиционируемся туда.

Поумничал и хватит, в результате нескольких часов, родился такой патч:

autocreate-implementation.diff

Применяется к версии Qt Creator из Git (от 2010-02-11), скорее всего применится и к последней официальной версии.

А вот немного как это выглядит у меня: