В прошлый раз я написал о том, что по-хорошему, с Qt Script надо бы куда-нибудь мигрировать пока не поздно..
И тут же поймал себя на мысли, что, возможно, я ошибаюсь и сделать автоматическую привязку слотов и свойств классов Qt в целевом языке займет чрезвычайно много времени, или вообще невозможно без влезания во внутренние структуры Qt, которые недоступны и недокументированы.
С этой целью и решил сделать свою библиотеку и привязать возможность скриптования с использованием Qt через Duktape, как основного движка для JS.
Результатом стали dukpp-03 и dukqt . В них удалось реализовать всё, что я пока хотел от скриптования с использованием Qt:
- автоматическую привязку слотов, конструкторов, свойств при регистрации класса;
- создание своих привязок для классов, не являющимися наследниками QObject;
- автоконверсию между классами QVector, QList, QHash, QMap и массивами, объектами с другой стороны;
- возможность перегрузки методов и функций на уровне привязок классов к скриптам.
Что пока не удалось сделать из-за ограничений по времени или отсутствия желания:
- connect() - пока соединение сигналов и слотов не сделано скриптуемым. Мне это не было нужно, но некоторый механизм для этого был сделан.
- QtScriptTools - подсветка JS-кода на уровне Qt и другие вещи. Некогда делать, да и задачи такой не ставилось.
- Вообще убрать регистрацию классов со стороны Qt со стороны C++. Сейчас нужно регистрировать классы по причинам, которые описаны в предыдущем посте. Ничего с этим пока поделать не удалось.
- Поддержка Qt 4 есть, но полноценно протестировать не удалось (поэтому версия 0.95, а не 1.0)
Результирующие библиотеки, само собой, планирую использовать в другом проекте, о котором писал раньше, так что возможно буду развивать дальше.
Что же до времени, то разработка заняла больше, чем я планировал в начале. В основном, из-за того, что в процессе работы в голову приходили новые интересные вещи, которые хотелось попробовать, или которые в моём опыте работы с QtScript были сделаны некрасиво.
Определённые неудобства доставил Qt4 и реализация QVariant в нём. Например, если в нем положить в QVariant указатель на класс производный от QObject, то указатель на QObject оттуда не достать оттуда никак. Наоборот тоже выполняется - если положить указатель на производный объект, как QObject*, и пытаться достать его оттуда, то это не удастся. Преобразования между числами так же пришлось писать вручную, так как это не всегда срабатывает так как нужно.
Некоторые участки, такие как примеры вызовов для QMetaMethod (особенно с типом конструктора) отсутствуют. В принципе, разобраться удалось, но тоже отняло некоторое время.
По результатам работы возник только один вывод: мигрировать с QtScript серьёзно не переписывая весь код в принципе сложно, но можно. Однако времени это может отнять достаточно много, поэтому перед этим стоит взвесить все за и против.
Комментариев нет:
Отправить комментарий