我对Qt很陌生,我希望使用模型来满足我的需求: 我有一个动态数量的子类实例需要以不同的方式处理(如果选择了每个实例,则为每个实例设置不同的UI控件)。我想获得一个列表视图,我可以在其中添加新元素或删除旧元素,以及禁用/启用现有元素。
当然我想尽可能少地重写代码,所以我想利用Listwidget和ListModel为用户提供一些控件。但是如何将这些(或更好的项目)链接到类的实例?
你知道这方面的任何教程吗? 我已经查看了QtDemo和Google,但我不知道要搜索的正确单词 所以我没有好结果。
基本上我认为我需要的是一个模型项,它接受Collider*
的数据。
但当我将其插入QStandardItem.setData()
时,它会显示error: ‘QVariant::QVariant(void*)’ is private
答案 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项的示例,您可以将其用作模板