Миграция с QSA на Qt Script
|
| Функция QSA | Замечания об эквивалентных функциях Qt Script |
|---|---|
| eval() | Функция eval в QSA открывая новую область видимости для кода, который выполняется в функции eval, поэтому локально определённые переменные не доступны извне. В Qt Script функция eval() разделяет текущую область видимости, делая локально определённые переменные доступными извне вызова eval(). |
| debug() | Эта функция недоступна в Qt Script. Используйте взамен print(). |
| connect() | QSA имеет замыкания, означающие что ссылка на функцию-член неявно содержит его объект this. Qt Script этого не поддерживает. Подробности об использовании функции connect смотрите в документации по Qt Script. |
| String.arg() | Эта функция недоступна в Qt Script. Используйте взамен replace() или concat(). |
| String.argDec() | Эта функция недоступна в Qt Script. Используйте взамен replace() или concat(). |
| String.argInt() | Эта функция недоступна в Qt Script. Используйте взамен replace() или concat(). |
| String.argStr() | Эта функция недоступна в Qt Script. Используйте взамен replace() или concat(). |
| String.endsWith() | Эта функция недоступна в Qt Script. Используйте взамен lastIndexOf(). |
| String.find() | Эта функция недоступна в Qt Script. Используйте взамен indexOf(). |
| String.findRev() | Эта функция недоступна в Qt Script. Используйте взамен lastIndexOf() и length. |
| String.isEmpty() | Эта функция недоступна в Qt Script. Используйте взамен length == 0. |
| String.left() | Эта функция недоступна в Qt Script. Используйте взамен substring(). |
| String.lower() | Эта функция недоступна в Qt Script. Используйте взамен toLowerCase(). |
| String.mid() | Эта функция недоступна в Qt Script. Используйте взамен substring(). |
| String.right() | Эта функция недоступна в Qt Script. Используйте взамен substring(). |
| String.searchRev() | Эта функция недоступна в Qt Script. Используйте взамен search() / match(). |
| String.startsWith() | Эта функция недоступна в Qt Script. Используйте взамен indexOf() == 0. |
| String.upper() | Эта функция недоступна в Qt Script. Используйте взамен toUpperCase(). |
| RegExp.valid | Это свойство недоступно в Qt Script поскольку оно не нужно; исключение SyntaxError возбуждается для плохих объектов RegExp. |
| RegExp.empty | Это свойство недоступно в Qt Script. Используйте взамен toString().length == 0. |
| RegExp.matchedLength | Это свойство недоступно в Qt Script. RegExp.exec() возвращает массив, чей размер имеет совпадающую длину. |
| RegExp.capturedTexts | Это свойство недоступно в Qt Script. RegExp.exec() возвращает массив захваченных текстов. |
| RegExp.search() | Эта функция недоступна в Qt Script. Используйте взамен RegExp.exec(). |
| RegExp.searchRev() | Эта функция недоступна в Qt Script. Используйте взамен RegExp.exec() или String.search()/match(). |
| RegExp.exactMatch() | Эта функция недоступна в Qt Script. Используйте взамен RegExp.exec(). |
| RegExp.pos() | Эта функция недоступна в Qt Script. Используйте взамен String.match(). |
| RegExp.cap() | Эта функция недоступна в Qt Script. RegExp.exec() возвращает массив захваченных текстов. |
QSA также определяет несколько внутренних Qt API, которых нет в Qt Script. Предоставляемые QSA типы, которые не предоставляются в Qt Script:
QSA - это больше, чем просто механизм выполнения сценариев. Он предоставляет управление проектами, редактор с завершением кода и минимальную IDE для редактирования проектов сценариев. С другой стороны, Qt Script - это просто механизм выполнения сценариев. Это означает, что эквивалента классам QSEditor, QSScript, QSProject и QSWorkbench в Qt Script нет. QSA также предоставляет те же расширенные API посредством QSUtilFactory и QSInputDialogFactory. Также нет эквивалента для этих классов в Qt Script API.
Имеется два разных способа сделать объекты QObject доступными из сценариев в QSA. Первый метод - через функции QSInterpreter::addTransientObject() и QSProject::addObject(). В этом случае объекты добавляются в глобальное пространство имён интерпретатора, используя их имена объектов в качестве имён переменных.
QPushButton *button = new QPushButton();
button->setObjectName("button");
interpreter->addTransientObject(button);
Код выше добавляет кнопку в глобальное пространство имён под именем "button". Единственное очевидное ограничение здесь - это то, что имеется возможность для любых неименованных объектов QObject или объектов, чьи имена конфликтуют. Qt Script предоставляет более гибкий способ добавления объектов QObject в окружение сценария.
QPushButton *button = new QPushButton();
QScriptValue scriptButton = engine.newQObject(button);
engine.globalObject().setProperty("button", scriptButton);
В вышеприведённом коде мы создаём QPushButton и обёртываем его в значение сценария, используя функцию QScriptEngine::newQObject(). Это даёт нам значение сценария, которое мы помещаем в глобальный объект используя имя "button". Концепция объектов и свойств, обсуждаемая выше, также полностью видимо здесь в открытом C++ API. Зависимости от имени объекта нет и мы может также разрешать конфликты имён более изящно. Здесь мы работаем непосредственно с объектами QScriptValue. Это реальный объект, который был передан в механизм сценариев, поэтому мы действительно имеем низкоуровневый доступ к внутренним структурам данных сценария, далеко за пределами возможного в QSA. Свойства, сигналы и слоты QObject доступны для автора сценария в Qt Script, как в QSA.
Другой способ сделать видимыми объекты QObject в QSA - создать QSObjectFactory, которая сделает возможным создание экземпляров объектов QObject из сценариев.
Ниже приведён некоторый код для примера фильтра в пакете QSA.
ModuleFactory::ModuleFactory()
{
registerClass( "ImageSource", &ImgSource::staticMetaObject);
...
}
QObject *ModuleFactory::create( const QString &type,
const QVariantList &,
QObject * )
{
if ( type == "ImageSource" )
return new ImgSource();
...
}
...
interpreter.addObjectFactory(new ModuleFactory());
Эквивалент в Qt Script написан аналогично конструкторам, написанным в сценариях. Мы регистрируем функцию обратного вызова C++ под именем "ImageSource" в глобальном пространстве имён и возвращаем из этой функции объект QObject:
QScriptValue construct_QPushButton(QScriptContext *, QScriptEngine *engine) {
return engine->newQObject(new QPushButton());
}
...
QScriptValue constructor = engine.newFunction(construct_QPushButton);
QScriptValue value =
engine.newQMetaObject(&QPushButton::staticMetaObject,
constructor);
engine.globalObject().setProperty("QPushButton", value);
В случае Qt Script мы используем подход, аналогичный используемому для показа QObject, а именно через QScriptEngine::newQObject(). Эта функция также имеет преимущество в том, что можно задать, сделает ли QObject видимыми свойства и слоты своего базового класса. Также возможно задать пользовательские права владения.
Читатель может задаться вопросом - почему мы не добавили функцию конструктора сразу в пространство имён, но создали ему в дополнение значение мета-объектного сценария. Конечно, обычная функция будет достаточно хороша, но создав основанный на QMetaObject конструктор мы без затрат получили перечисления QPushButton в объекте функции QPushButton. Для сравнения - сделать видимыми перечисления в QSA весьма тяжело.
Если мы хотим в Qt Script добавить к типу QPushButton больше "статических" данных, мы вольны добавить свойства, аналогично тому как мы сделали это для сценария. Также можно добавить пользовательские функции к экземпляру QPushButton Qt Script, установив на неё больше свойств, например, сделав доступной функцию C++ setText(). Этого можно также добиться установкой пользовательского прототипа, эффективно использующего память, как обсуждалось в примере сценария выше.
В QSA можно сделать видимыми для QSA объекты, не унаследованные от QObject, обернув их в QObject и используя для того, чтобы сделать их видимыми, либо QSWrapperFactory, либо QSObjectFactory. Решить, когда использовать каждый из этих классов, может смутить, так как один использовался для конструирования на основе сценариев, а другой - для обёртывания параметров функции и возвращения значений, но по существу они делают одно и то же.
В Qt Script, предоставление доступа к объектам QObject и к объектам, не унаследованным от QObject, делается таким же способом, что показан выше, создавая функцию конструктора и добавляя свойства или пользовательский прототип к сконструированному объекту.
QSA поддерживал жёстко запрограммированный набор отображений типов, которые охватывают большинство типов QVariant, объектов QObject и примитивов. Для более сложных сигнатур типов, таких как инструментальные классы на основе шаблонов, он имеет довольно ограниченную поддержку. Qt Script значительно лучше в отображении типов и конвертируется списки шаблонных типов в массивы соответствующих типов, при том что все типы объявлены в мета-объектной системе.
| Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies) | Торговые марки | Qt 4.6.4 |
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |