В данной главе разсказывается о генераторе C++ файлов, необходимых при использовании библиотеки Qt http://www.trolltech.com. Описываемый генератор был протестирован на Qt версии 3.3.3.
При использовании Qt в трех случаях возникает необходимость генерирования C++ файлов с помощью входящих в состав Qt инструментов:
Для генерации используется утилита moc. Обычно из файла a.cpp генерируется файл a.moc (т.е. расширение заменяется на .moc).
Генератор для Qt, который входит в состав Mxx_ru, позволяет обрабатывать перечисленные выше случаи.
Описание генератора для Qt содержится в файле mxx_ru/cpp/qt.rb, который подключается в проектный файл посредством require:
Генератор для Qt реализован в виде класса Mxx_ru::Cpp::Qt_gen. Чтобы создать генератор для Qt необходимо создать в проекте объект этого класса:
Конструктор класса Qt_gen получает два аргумента: ссылку на объект-цель, в которой будет использован генератор, и набор символов препроцессора, которые будут установлены при компиляции проекта. По-умолчанию второй аргумент равен [’QT_DLL’, ’QT_THREAD_SUPPORT’]. Если используется вариант Qt в виде dll, с поддержкой многопоточности, то второй аргумент в конструктор Qt_gen можно не указывать. В остальных случаях следует передать во втором аргументе необходимые для используемой версии Qt символы препроцессора. Например, если необходим вариант Qt в виде статической библиотеки, но с поддержкой многопоточности, то следует указать:
Заголовочные файлы, из которых нужно сгенерировать исходные файлы посредством утилиты moc указываются генератору с помощью функции h2moc:
Указанное имя ищется относительно текущего значения sources_root (см. 5.10.1 на стр. 67). В приведенном пример файл mywidget.hpp должен быть расположен в каталоге some/project. В этот же каталог будет помещен результат работы утилиты moc1.
Из перечисленных с помощью метода h2moc файлов строятся файлы, в имя которого добавляется префикс moc_, а расширение заменяется на .cpp (если не изменено с помощью атрибута cpp_ext, см. 8.2.7 на стр. 95). Так из some/project/mywidget.hpp будет получен файл some/project/moc_mywidget.cpp.
Исходные (.cpp) файлы, из которых нужно сгенерировать исходные (.moc) файлы посредством утилиты moc указываются генератору с помощью функции cpp2moc:
Указанное имя ищется относительно текущего значения sources_root (см. 5.10.1 на стр. 67). В приведенном пример файл mywidget.cpp должен быть расположен в каталоге some/project. В этот же каталог будет помещен результат работы утилиты moc2.
Из перечисленных с помощью метода cpp2moc файлов строятся файлы, у которых расширение заменяется на .moc (если не изменено с помощью атрибута moc_ext, см. 8.2.9 на стр. 96). Так из some/project/mywidget.cpp будет получен файл some/project/mywidget.moc.
Результаты работы Qt Designer, сохраненные в виде .ui-файлов, указываются генератору с помощью метода ui:
Указанное имя ищется относительно текущего значения sources_root (см. 5.10.1 на стр. 67). В приведенном пример файл myform.ui должен быть расположен в каталоге some/project. В этот же каталог будет помещен результат работы утилиты ui.
Из перечисленных с помощью метода ui файлов строятся файлы заголовочные файлы, у которых расширение заменяется на .hpp (если не изменено с помощью атрибута hpp_ext, см. 8.2.8 на стр. 95), и исходные файлы, у которых расширение заменяется на .cpp (если не изменено с помощью атрибута cpp_ext, см. 8.2.7 на стр. 95). Имена сгенерированных заголовочных файлов затем указываются генератору через метод h2moc для генерации вспомогательного исходного файла. В результате из some/project/myform.ui будут получены файлы some/project/myform.hpp, some/project/myform.cpp, some/project/moc_myform.cpp.
По-умолчанию, результаты работы утилиты moc помещаются в тот же каталог, в котором находились исходные файлы для утилиты moc. В некоторых случаях это не очень удобно. Например, если требуется перейти на новую версию Qt удалив при этом старые результаты работы moc. Проще это сделать, если размещать сгенерированные файлы в отдельный подкаталог.
В классе Mxx_ru::Cpp::Qt_gen есть атрибут moc_result_subdir, который определяет размещение разультатов работы moc. Если этот атрибут содержит nil (значение по-умолчанию), то сгенерированные файлы помещаются рядом с исходными файлами. Если назначить атрибуту moc_result_subdir значение, то в качестве результирующего будет использоваться указанный подкаталог исходного каталога. Например:
Из файла h/mywidget.hpp будет сгенерирован файл h/moc/moc_mywidget.cpp.
Значение атрибута moc_result_subdir оказывает влияние только на файлы, которые перечисляются с помощью методов h2moc и cpp2moc.
По-умолчанию, при генерации исходных файлов с помощью moc и ui для результирующих файлов используется расширение .cpp. Изменить его можно назначив новое значение атрибуту cpp_ext объекта-генератора:
Из файла h/mywidget.H будет сгенерирован файл h/mywidget.CC.
По-умолчанию, при генерации заголовочных файлов с помощью ui для результирующих файлов используется расширение .hpp. Изменить его можно назначив новое значение атрибуту hpp_ext объекта-генератора:
Из файла myform.ui будет сгенерирован файл myform.h.
По-умолчанию, при генерации исходных файлов с помощью moc для результирующих файлов используется расширение .mic. Изменить его можно назначив новое значение атрибуту moc_ext объекта-генератора:
Из файла mywidget.cpp будет сгенерирован файл mywidget.cpp.moc.
Имя утилиты moc находится в атрибуте moc_name объекта-генератора. По-умолчанию это moc. Изменение данного атрибута позволяет указать другое имя, которое будет использоваться для запуска утилиты moc:
Имя утилиты uic находится в атрибуте uic_name объекта-генератора. По-умолчанию это uic. Изменение данного атрибута позволяет указать другое имя, которое будет использоваться для запуска утилиты uic: