Qt:使用默认模型选择我的数据

时间:2011-11-29 14:16:25

标签: model-view-controller qt

我对Qt很陌生,我希望使用模型来满足我的需求: 我有一个动态数量的子类实例需要以不同的方式处理(如果选择了每个实例,则为每个实例设置不同的UI控件)。我想获得一个列表视图,我可以在其中添加新元素或删除旧元素,以及禁用/启用现有元素。

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

你知道这方面的任何教程吗? 我已经查看了QtDemo和Google,但我不知道要搜索的正确单词 所以我没有好结果。

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

2 个答案:

答案 0 :(得分:1)

所以我找到了解决这个问题的方法。 由于QStandardItem能够存储QVariant s作为数据,我想在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

答案 1 :(得分:0)

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