Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: Sasha от Январь 16, 2014, 19:34



Название: Q_ENUMS в скриптах
Отправлено: Sasha от Январь 16, 2014, 19:34
Здравствуйте,
Хочу использовать имена перечислений в скриптах, но что-то не получается.

В документации сказано
Цитировать
Значения для перечислений объявленных с помощью Q_ENUMS не доступны в качестве свойств отдельных объектов-обёрток; вернее, они являются свойствами объекта-обёртки QMetaObject, который можно создать с помощью QScriptEngine::newQMetaObject().
Ссылка ведёт на следующее описание:
Цитировать
QScriptValue QScriptEngine::newQMetaObject ( const QMetaObject * metaObject, const QScriptValue & ctor = QScriptValue() )
Creates a QtScript object that represents a QObject class, using the the given metaObject and constructor ctor.
Enums of metaObject (declared with Q_ENUMS) are available as properties of the created QScriptValue. When the class is called as a function, ctor will be called to create a new instance of the class.
Пример:
Код
C++ (Qt)
QScriptValue mySpecialQObjectConstructor(QScriptContext *context,
                                         QScriptEngine *engine)
{
    QObject *parent = context->argument(0).toQObject();
    QObject *object = new QObject(parent);
    return engine->newQObject(object, QScriptEngine::ScriptOwnership);
}
...
 
QScriptValue ctor = engine.newFunction(mySpecialQObjectConstructor);
QScriptValue metaObject = engine.newQMetaObject(&QObject::staticMetaObject, ctor);
engine.globalObject().setProperty("QObject", metaObject);
 
QScriptValue result = engine.evaluate("new QObject()");
 
See also newQObject() and scriptValueFromQMetaObject().
А что дальше не понятно. Допустим, в этом QObject-е есть такое перечисление:
Код
C++ (Qt)
...
enum eType{ Type1, Type2 };
Q_ENUMS( eType )
...
 
Как мне теперь его использовать в скрипте? Из всего вышесказанного в скрипте должно работать нечто вроде:
Код
C++ (Qt)
var v = QObject.Type1;
 
или
Код
C++ (Qt)
var v = QObject().Type1;
 
Но что-то не работает.
Чего не хватает?


Название: Re: Q_ENUMS в скриптах
Отправлено: Sasha от Январь 16, 2014, 20:08
Извиняюсь, моя ошибка. Всё работает, просто в моей программе класс называется не QObject, как в примере, а по другому и я сделал переименование везде, кроме строчки
Код
C++ (Qt)
QScriptValue metaObject = engine.newQMetaObject(&QObject::staticMetaObject, ctor);
 
В результате создание объекта класса в скрипте работало, а вот перечисления не виделись ( ведь в QObject::staticMetaObject нет моих перечислений)

Правда, пока продолжают не видиться перечисления, объявленные в других классах, но обёрнутые макросом Q_ENUMS в моём. Т.е. не видятся перечисления в таком случае:
Код
C++ (Qt)
class A
{
...
 enum eType{ Type1, Type2 };
...
};
class C: public QObject
{
Q_OBJECT
Q_ENUMS( A::eType )
};
 


Название: Re: Q_ENUMS в скриптах
Отправлено: lesav от Январь 18, 2014, 16:22
Ничего не остается как сделать так:
Код
C++ (Qt)
class A
{
...
   enum eType{ Type1, Type2 };
...
};
class C: public QObject
{
Q_OBJECT
Q_ENUMS( eType )
...
enum eType{
   Type1=A::eType::Type1,
   Type2=A::eType::Type2
};
...
};
 


Название: Re: Q_ENUMS в скриптах
Отправлено: Sasha от Январь 21, 2014, 10:39
Ничего не остается как сделать так:
Код
C++ (Qt)
class A
{
...
   enum eType{ Type1, Type2 };
...
};
class C: public QObject
{
Q_OBJECT
Q_ENUMS( eType )
...
enum eType{
   Type1=A::eType::Type1,
   Type2=A::eType::Type2
};
...
};
 

Да, так работает, но если поменяется eType в классе A нужно не забыть поменять и в C, что по-моему не есть хорошо. А что по другому никак? Может просто есть какой-то нюанс. Ведь в документации же сказано:
Цитировать
If you want to register an enum that is declared in another class, the enum must be fully qualified with the name of the class defining it. In addition, the class defining the enum has to inherit QObject as well as declare the enum using Q_ENUMS().
т.е, вроде, просто нужно правильно двоеточия поставить, но примера нет. Кстати, класс A я наследовал от QObject и всё-равно не работает.