Как проверить, является ли это действительный указатель QObject, созданный QMetaType :: create () - PullRequest
0 голосов
/ 30 января 2020

Мне нужно преобразовать QVariant в другие пользовательские пользовательские классы.

Все классы должны быть производными от QObject.

Я могу проверить во время компиляции тип назначения, потому что это шаблон, но источником является QVariant, поэтому его нельзя проверить.

Мой метод:

template<class T, typename = std::enable_if_t<std::is_base_of<QObject, T>::value> > static bool canConvert(const QVariant& var)

вызывает это:

QObject* from = reinterpret_cast<QObject*>(QMetaType::create(var.userType()));

from никогда не имеет значение null, но, если userType не относится к базовому классу QObject, from не является допустимым указателем QObject, и при вызове происходит сбой:

from->metaObject();

Я не могу сделать dynamic_cast из void* из QMetaType::create()

Я пробовал qobject_cast из from, но это не дает сбоя, если оно недействительно

Как узнать, если QObject* from действительный указатель на QObject производный класс?

1 Ответ

0 голосов
/ 30 января 2020

Я нашел решение.

Если типом является, например, MyType, его тип указателя должен быть зарегистрирован.

qRegisterMetaType<MyType*>();

Итак, здесь элементарный метод чтобы проверить, получен ли он из QObject:

    static bool isClassDerivedFromQObject(const QVariant& var)
    {
        QString className(QMetaType::typeName(var.userType()));
        className.append("*"); // create a pointer of the name
        const auto id = QMetaType::type(className.toLatin1().data());
        const auto metaObject = QMetaType::metaObjectForType(id);
        return metaObject != nullptr;
    }

Это можно вызвать до QMetaType::create(var.userType())

...