首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查它是否是由QMetaType::create()创建的有效QObject指针

如何检查它是否是由QMetaType::create()创建的有效QObject指针
EN

Stack Overflow用户
提问于 2020-01-30 17:49:35
回答 1查看 193关注 0票数 0

我需要将QVariant转换为其他用户自定义类。

所有类都必须从QObject派生。

我可以在编译时检查目标类型,因为它是一个模板,但是源代码是一个QVariant,所以不能检查它。

我的方法是:

代码语言:javascript
复制
template<class T, typename = std::enable_if_t<std::is_base_of<QObject, T>::value> > static bool canConvert(const QVariant& var)

将其称为:

代码语言:javascript
复制
QObject* from = reinterpret_cast<QObject*>(QMetaType::create(var.userType()));

from从不为空,但是,如果userType不是QObject基类,则from不是有效的QObject指针,并且在调用时调用崩溃:

代码语言:javascript
复制
from->metaObject();

我无法从QMetaType::create()执行dynamic_cast of a void*

我尝试了fromqobject_cast,但如果它无效,它不会失败

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 18:31:18

我找到了一个解决方案。

如果类型是MyType,则必须注册它的指针类型。

代码语言:javascript
复制
qRegisterMetaType<MyType*>();

因此,这里有一个基本的方法来检查它是否是从QObject派生的:

代码语言:javascript
复制
    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())之前调用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59983156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档