我需要将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()执行dynamic_cast of a void*
我尝试了from的qobject_cast,但如果它无效,它不会失败
如何知道QObject* from是否是指向QObject派生类的有效指针?
发布于 2020-01-30 18:31:18
我找到了一个解决方案。
如果类型是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())之前调用
https://stackoverflow.com/questions/59983156
复制相似问题