16 июля 2010

Использование QtScriptGenerator

QtScriptGenerator (далее - Кугенератор) позволяет сделать доступным почти любой Qt или Qt-подобный класс в среде Qt Script.

Приступим:
1. Скачиваем исходный код qtscriptgenerator из моего репозитория:
git clone git@gitorious.org:~asvil/qt-labs/asvils-qtscriptgenerator.git qtscriptgenerator
cd qtscriptgenerator

2. Читаем readme и компилируем:
cd generator
qmake && make

3. Запускаем созданный на предыдущем шаге Кугенератор без параметров для генерации системы классов-оберток. Система классов-оберток - это система позволяющая использовать c++ классы в Qt Script. В последствие мы будем генерировать данную систему для своих классов.
./generator

4. Переходим в каталог с заготовленными Qt проектам для компиляции систем классов-оберток.
cd ../qtbindings

5. Если ваша сборка Qt содержит все модули, можно сделать:
qmake && make

Иначе переходите в каталоги с названиями необходимых модулей и компилируйте:
cd qtscript_core
qmake && make

6. Полученные плагины-расширения для Qt Script располагаются в папке qtscriptgenerator/plugins/script. Необходимо папку 'script' с содержимым поместить рядом с исполняемым файлом вашего проекта или указать местоположения плагинов вызвав QCoreApplication::addLibraryPath();
7. В своем проекте после создания QScriptEngine вызвать QScriptEngine::importExtension('qt.core'), используя в качестве параметра необходимый Qt модуль.

Теперь давайте используем Кугенератор для своих личных классов используя CMake систему сборки. Предполагается, что классы скопилированы в библиотеку. Общий метод такой:
1. Скачиваем qtscripttemplate в ту же папку, где храниться Кугенератор.
git clone git@gitorious.org:qtscripttemplate/qtscripttemplate.git
cd qtscripttemplate

2. Создаем необходимые папки.
mkdir lib
mkdir include

3. В папку 'lib' копируем библиотеку. В папку 'include' заголовочные файлы библиотеки.
4. Настраиваем систему сборки, а таке систему генерируемых Кугенератором классов. Открываем buildplugin/CMakeLists.txt
Создаем переменную с имененм проекта:
set (PROJECT YOUR_SCRIPT_PLUGIN_NAME)
Создаем переменную с именем Qt Script расширения. Данное имя будет в последствие использоваться методом QScriptEngine::importExtension();
set (QS_PACKAGE_NAME YOUR_PACKAGE_NAME)
Находим строку: set(QT_USE_QTSCRIPT TRUE) и после нее вводим в данном стиле список используемых вашей библиотекой Qt модулей. Например, set(QT_USE_QTNETWORK TRUE) и т.д.
Далее переходим к редактированию файла plugin_build.txt.in и снимаем комменатрий с используемых библиотекой Qt модулей.
Теперь мы будем настраивать систему классов экспортируемых библиотекой. Открываем файл plugin_typesystem.xml.in и перечисляем экспортируемые классы, перечисления, пространствы имен с помощью соответсвующих тегов с атрибутами:
Пространство имен:
<namespace-type name="YourNamespace"/>

Перечисление:
<enum-type name="Namespace::SomeEnum"/> или <enum-type name="SomeClass::SomeEnum"/> 

Имеющий предка QObject и макрос Q_OBJECT:
<object-type name="QObjectSubclass"/>

Не имеющий предка QObject, но имеющие конструктор копии и оператор присваивания:
<value-type name="NonQObjectClass"/>

Подробнее об этих тегах и их использовании можно узнать здесь.
Теперь запускаем процесс генерации проекта и затем компилируем полученные классы-обертки:
cmake buildplugin -DCMAKE_BUILD_TYPE=Release
make

Следите за генерацией классов. Кугенератор предупреждает о том, какие перечисления, члены, методы класса он не смог экспортировать. Перечисления чаще всего просто не добавлены в файл plugin_typesystem.xml.in, а члены и методы содержат в себе неизвестные типы, т.е. типы которые не представлены в вышеназванном файле.
Полученный Qt Script плагин можно найти в папке plugins/script и поступить с ним также, как поступали выше.

Для некоторых библиотек созданы соответсвующие ветки: log4qt, ncreport252, qserialdevice. Переключившись на данные ветки необходимо только скопировать заголовочные файлы и саму библиотеку.
Например:
git branch --track origin/qserialdevice
mkdir lib
mkdir include
.....................
# Copy your library and headers
.....................
cmake biuldplugin -DCMAKE_BUILD_TYPE=Release
make

Комментариев нет:

Отправить комментарий