2011-11-29 59 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