如何将QVariant转换为自定义类?

25

我正在使用Momentics IDE(本地SDK)开发BlackBerry 10移动应用程序。

我有一个列表视图,我想要使用C++来处理它的项点击事件(我需要使用C++而不是QML)。

我可以使用“connect”指令获取索引路径,但我在将QVariant解析为自定义类时遇到问题;

Q_ASSERT(QObject::connect(list1, SIGNAL(triggered(QVariantList)), this, SLOT(openSheet(QVariantList))));

QVariant selectItem = m_categoriesListDataModel->data(indexPath);

我尝试使用静态转换,如下所示

Category* custType = static_cast<Category*>(selectItem);

但是它返回:

"invalid static_cast from type 'QVariant' to type 'Category*'"

有人能帮我吗?


你能添加代码展示如何向模型中添加数据吗? - Kunal
11
不要在这种情况下使用 Q_ASSERT!Q_ASSERT 在发布版本中不起作用,而信号也将不会连接。 - Dmitry Sazonov
2个回答

39

编辑:适用于非QObject派生类型(参见Final Contest的回答)

首先,您需要注册您的类型以成为QVariant管理的类型之一。

//customtype.h
class CustomType {
};

Q_DECLARE_METATYPE(CustomType)

那么,您可以通过以下方式从QVariant中检索您的自定义类型:

CustomType ct = myVariant.value<CustomType>();

等价于:

CustomType ct = qvariant_cast<CustomType>(myVariant);

谢谢你的帮助。我尝试按照你描述的方式放置“Q_DECLARE_METATYPE”指令,但它返回一个错误“在此上下文中”,我认为这是因为我的自定义类型继承自QObject类:“class Category: public QObject”。 - Mohamed Jihed Jaouadi
@FinalContest 是正确的。问题没有提到您正在处理一个 QObject 派生类型。 - epsilon
1
你的评论帮了我很多,我觉得你的应该是答案,而ldapps应该是另一个问题的答案,因为J.M.J在原始帖子中没有指定他们是从QObject派生的。 - Krupip
在Qt 15.8中,存在一个错别字,正确的宏是Q_DECLARE_METATYPE(META和TYPE之间没有下划线)。 - antoine

30

你可以尝试使用 qvariant_castqobject_cast

QObject *object = qvariant_cast<QObject*>(selectItem);
Category *category = qobject_cast<Category*>(object);

另外,永远不要将任何持久性声明放入Q_ASSERT中。当未启用assert时,它将不会被使用。


1
感谢提供的信息。关于“Q_DECLARE_METATYPE”,我尝试将其放在类定义中,就像这样示例,但它不起作用;它返回“在此上下文中”(我认为这是因为该类是QObject类“class Category: public QObject”),当我尝试将其放在类定义之外的任何地方时,它会返回“模板声明不能出现在块范围内”。 - Mohamed Jihed Jaouadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接