Russian Qt Forum
Ноябрь 22, 2024, 17:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Q_ENUMS в скриптах  (Прочитано 4740 раз)
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;
 
Но что-то не работает.
Чего не хватает?
Записан
Sasha
Гость
« Ответ #1 : Январь 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 )
};
 
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #2 : Январь 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
};
...
};
 
Записан

Sasha
Гость
« Ответ #3 : Январь 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 и всё-равно не работает.
« Последнее редактирование: Январь 21, 2014, 12:16 от Sasha » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.35 секунд. Запросов: 23.