2011-03-08 37 views
16

我想從QML中的ListView中訪問角色。從本質上講,我有這個在我的QML:如何從QML中的listview中訪問currentItem的角色?

ListView { 
    id: myId 
    model: myModel 
    delegate: Item { 
     Text { 
      text: model.text 
     } 
     Text { 
      text: model.moreText 
     } 
    } 
} 

myModel是QAbstractListModel實現。這個QML部分是一個可重用的組件,因此該模型可以具有各種數據類型的任意數量的不同角色。我想要做的是綁定到ListView的currentItem屬性的給定角色的值。換句話說,我想有可能在ListView的屬性到當前選擇的項目結合如下頁面上的其他一些Component

Text { 
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar) 
} 

請記住,我需要這個一般可用,因爲我會爲許多模型類型做很多工作,我試圖不爲每個模型和ListView編寫那種自定義代碼。

它似乎應該很容易訪問當前選定項目的屬性,但據我所知,這是不可能的。由於模型在只有一個角色時似乎被區別對待,這個問題變得更加複雜。我的意思是,有時你通過model.roleName訪問你的角色,而當你只有一個角色時,你使用modelData

如果有人有任何建議,我會很感激。非常感謝!

編輯

我發現這一點:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

然而,這似乎並沒有爲我工作。當我嘗試在我的QML腳本中使用數據時出現類型錯誤,並且沒有可用的類型轉換,因此我不知道該怎麼做。歡迎任何建議!

謝謝!

傑克

回答

19

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778的代碼應該工作,雖然我看到錯誤,如果財產被命名爲「數據」;它看起來像是覆蓋了一些現有的內置屬性。它重命名爲「myData的」似乎工作:

ListView { 
    id: myId 
    model: myModel 
    delegate: Item { 
     property variant myData: model 
     Text { 
      text: model.text 
     } 
     Text { 
      text: model.moreText 
     }  
    } 
} 

Text { text: myId.currentItem.myData.text } 

(該myId.currentItem.text代碼在原崗位沒有工作,因爲這是試圖指文本財產您的代理中,這是不存在的。)

在問候指模型 VS modelData委託範圍內,差異取決於模型的類型,而不是在模型中角色的數量。如果模型是字符串列表或對象列表,modelData用於引用委託中的單個字符串或對象(因爲字符串列表和對象列表沒有任何角色)。對於包括QML ListModel和Qt C++ QAbstractItemModel在內的所有其他模型,model.role可用於引用委託中的角色。

+0

非常感謝您的回覆!嗯...我以爲徹底地嘗試了這一點,但可能會有一些我錯過的細微差別。很高興知道它在爲某人工作!我會再次給這個解決方案,看看這是否有訣竅。我很欣賞model.role和modelData之間的解釋。我會讓你知道結果如何。再次感謝! – 2011-03-09 19:59:51

+1

看起來確實有效。不知道我以前錯過了什麼。無論哪種方式,這個解決方案花了幾個小時才找到希望,現在它在StackOverflow上,其他人將能夠快速找到它。再次感謝! – 2011-03-10 12:14:41

+0

有什麼辦法可以抽象出不同的模型類型嗎?我在問,因爲我想在測試期間處理QML ListModel,並在C++應用程序中使用相同的QML代碼處理對象列表。 – ssc 2013-08-29 11:18:27

7

你可以或者直接訪問模式,以類似

Text { text: myModel[myId.currentIndex].text } 
+0

這看起來不起作用:TypeError:無法讀取未定義的屬性「文本」 – 2017-07-18 05:00:18

1

您可以訪問使用get()函數的ListModel的ListElement。

Text { text: myModel.get(myId.currentIndex).text } 
+0

請您詳細說明您的答案,並增加關於您提供的解決方案的更多描述? – abarisone 2016-08-30 09:14:15

+1

@abarisone myModel是您將提供給ListView的模型,myId是listView,文本是角色。例如'的ListModel { ID:基於myModel ListElement { 文字: 「蘋果」 成本:2.45 } ListElement { 文字: 「橙色」 成本:3.25 } ListElement { 文字: 「香蕉」 成本:1.95 }} 的ListView { ID:身份識別碼 anchors.fill:父 模型:基於myModel 代表:文字{文字:} }' – 2016-08-31 06:38:54

+0

這是應該連工作如果模型中定義C++?因爲我似乎無法使它工作。它說財產得到沒有定義。 – Savvas 2017-06-21 19:19:39

相關問題