2011-11-29 56 views
0

我对Qt来说很新颖,并且在我想要使用模型满足我需求的情况下: 我有一个动态数量的需要处理的子类实例不同(如果选择了每个UI控件)。我想获得一个列表视图,我可以添加新元素或删除旧元素,以及禁用/启用现有元素。Qt:使用默认模型来选择我的数据

当然,我想尽可能地重写代码,所以我想利用Listwidget和ListModel为用户提供一些控件。但是如何将这些(或更好的项目)链接到类的实例?

你知道关于这个的任何教程吗? 我已经看过QtDemo和谷歌,但我不知道合适的词搜索 ,所以我没有好的结果。

基本上我认为我需要的是一个模型项目,它的数据接受Collider*。 但是,当我把它插入QStandardItem.setData()它说error: ‘QVariant::QVariant(void*)’ is private

回答

1

所以我找到了解决此问题的方案。 由于QStandardItem s能够存储QVariant作为数据我想存储一个指向我的数据的指针在QVariant。为了达到这个目的,我不得不使用Q_DECLARE_METATYPE(MyType*)。 有了这个,我能

MyType *MyInstance = new MyType; 
QVariant data; 
data.setValue(MyInstance); 
QStandardItem *item = new QStandardItem("My Item"); 
item->setData(data); 
standardModel->appendRow(item); 

而最好的是,你可以添加你想要的类型,让QVariant做的工作,以决定是否包含你想要的类型:

if(v.canConvert<MyType*>()) 
//Yes it is MyType 
else if(v.canConvert<MyOtherType*>()) 
    //Oh it is the other one 

所以最后,这只需要声明元类型,因此您不必子类化任何项目。

你也应该阅读这这里的局限性:
Q_DECLARE_METATYPE
qRegisterMetaType

0

是否this页面回答您的问题吗?有一个派生StringListModel项目的示例,您可以将其用作模板

+0

它已经有一段时间了,遗憾的答案下旬至你的答案:这描述了我想要避免。有很多例子,你只需要将一个指针作为数据分配给一个应该支持而不需要子类化的项目。幸运的是,我似乎找到了一个我将在这里发布的解决方案。 – Nobody