c++ - 如何检查它是否是由 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_cast
从void*
QMetaType::create()
我试过qobject_cast
了,from
但如果它无效,它不会失败
我如何知道是否是指向派生类QObject* from
的有效指针?QObject
解决方案
我找到了解决方案。
例如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())
推荐阅读
- spring-security - 使用 Spring WebSocket 和安全性进行多房间授权
- c++ - 如何让 CMake 使用库的 -l 选项而不是由 cmake_find_package 创建的 IMPORTED 包的完整路径名?
- elasticsearch - 验证我对 elasticsearch 中 Dismax 查询的理解
- android-studio - Android Studio 4.0 New->Activity->Blank Activity 提供创建新的 Wear OS 空白活动(在任何项目上)
- powershell - Add-PnPFile 流输出中的无效字符
- sql - 有客户点击问题的谷歌大查询排名顺序
- python - 为什么我在启动我的 firebase 项目时会收到错误消息?
- r - 我可以在 RMarkdown 中执行突出显示的文本吗?
- javascript - 在前三个字符后插入破折号,然后是四个字符 Jquery 或 Javascript。最好的方法
- c++ - 优先队列自定义比较器