【问题标题】:How to check if it's a valid QObject pointer, created by QMetaType::create()如何检查它是否是由 QMetaType::create() 创建的有效 QObject 指针
【发布时间】:2020-05-15 21:35:03
【问题描述】:

我需要将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();

我不能从QMetaType::create()void*dynamic_cast

我尝试了qobject_castfrom,但如果无效也不会失败

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

【问题讨论】:

    标签: c++ qt qobject qmetaobject qmetatype


    【解决方案1】:

    我找到了解决办法。

    如果类型是,例如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())之前调用

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多