首页 > 解决方案 > 如何检查它是否是由 QMetaType::create() 创建的有效 QObject 指针

问题描述

我需要转换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永远不会为空,但如果userType不是QObject基类,from则不是有效QObject指针,并且调用在调用时崩溃:

from->metaObject();

我不能dynamic_castvoid*QMetaType::create()

我试过qobject_cast了,from但如果它无效,它不会失败

我如何知道是否是指向派生类QObject* from的有效指针?QObject

标签: c++qtqobjectqmetaobjectqmetatype

解决方案


我找到了解决方案。

例如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())


推荐阅读