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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMetaEnum из staticMetaObject  (Прочитано 4178 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Май 16, 2011, 01:00 »

Здравствуйте. Захотел написать функцию, которая бы возвращала QMetaEnum по названию перечисления... и не смог. Точнее написать-то написал:
Код
C++ (Qt)
class Enums : QObject
{
Q_ENUMS(...)
...
public:
static QMetaEnum metaEnumFromName(const char *enumName);
};
 
static QMetaEnum Enums::metaEnumFromName(const char *enumName)
{
const QMetaObject metaObject = Enums::staticMetaObject;
return metaObject.enumerator(metaObject.indexOfEnumerator(enumName));
}
Получал через эту фукцию QMetaEnum, количество ключей возвращалось верное (смотрел через qDebug()), но при вызове например QMetaEnum::value(0) случался краш (хотя QMetaEnum::key(0) возвращал правильную строку). А если не крашилось, то случалось так, что количество ключей резко становилось равным 1.

Убил несколько часов, пытаясь понять в чём дело. Решил запустить программу под мак ос (до этого запускал под виндой), и крашиться уже начало во время запроса количества ключей (первое действие с объектом QMetaEnum). Тут уже оказалось, что объект после возвращения из функции становится недействительным (хотя в документации ничего на этот счёт не сказано), а каждый раз писать одни и те же строчки получения QMetaEnum не хотелось, тем более что я хотел добавить функцию, возвращающую мне определённый QMetaEnum (чтоб постоянно в параметре его имя не передавать). Потому решил написать макрос, решающий поставленную задачу:
Код
C++ (Qt)
#define META_ENUM_FROM_NAME(metaEnum, enumName) \
const QMetaObject metaObject = Enums::staticMetaObject; \
metaEnum = metaObject.enumerator(metaObject.indexOfEnumerator(enumName))
 
#define STATISTIC_META_ENUM(metaEnum) META_ENUM_FROM_NAME(metaEnum, "Statistic")

Вопрос: может я что-то упускаю и можно сделать проще?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Май 16, 2011, 07:40 »

Зря вы из кода выкинули «лишнее», но может так:
Код
C++ (Qt)
static QMetaEnum Enums::metaEnumFromName(const char *enumName)
{
return Enums::staticMetaObject.enumerator(Enums::staticMetaObject.indexOfEnumerator(enumName));
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Май 16, 2011, 09:11 »

хы, работает... спасибо!

а оказалось я допустил ошибку в своем методе - пропустил &. При объявлении metaObject доверился хелпу, а там возвращаемое значение указано const QMetaObject Улыбающийся
Код
C++ (Qt)
static QMetaEnum Enums::metaEnumFromName(const char *enumName)
{
const QMetaObject &metaObject = Enums::staticMetaObject;
return metaObject.enumerator(metaObject.indexOfEnumerator(enumName));
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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