2017-01-31 58 views
0

我想在我的QML ListModel上實現一個回調函數,以便在ListModel中的數據發生更改時執行一些操作。顯然,不可能在...上創建...更改ListModel中單個用戶定義屬性的處理程序。所以,我試圖使用ListModel可用的onDataChanged處理程序。QML ListModel onDataChanged問題

ListModel { 
    id: model 

    onDataChanged: { 
     console.warn("onDataChanged: "+get(topLeft).val + " vs. " + get(bottomRight).val) 
    } 
} 

但是,onDataChanged似乎只引用ListModel中的第一個元素。也就是說,即使我在列表中操縱元素,topLeft和bottomRight也始終指向第一個元素。

我在這裏需要的是一個可靠的處理程序,當它觸發時,它可以準確地反映ListModel中正確的行。

+0

如果您使用[通用對象模型](http://stackoverflow.com/questions/35160909/how-to-create-a-generic-object-model-for-use-in-qml/35161903#35161903 )然後您可以使用具有單個更改通知的常規屬性。 – dtech

+0

由於項目的限制,不可能。爲什麼當我操縱一個不同的行時,onDataChanged會返回第一行?我只是不正確地使用這些參數? – user1765354

+0

'QAbstractItemModel :: dataChanged()'的參數是'QModelIndex',即類類型的對象。 您正在將這些函數傳遞給期望整數的函數,JavaScript環境可能會執行其魔術類型轉換之一。 對於變化很奇怪的數據使用ListModel通常表示適當的自定義模型會更好。 –

回答

0

當我更改ListModel中的數據時,一切似乎都正確。 嘗試這個例子:

Window { 
    id: mainWindow 
    visible: true 
    width: 1200 
    height: 800 

    ListModel { 
     id: lm 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 
     ListElement { test: 0 } 

     onDataChanged: console.log('Data Changed', topLeft.row, get(topLeft.row).test, data(topLeft, roles[0])) 
    } 

    ListView { 
     width: 200 
     height: 800 
     model: lm 
     delegate: Button { 
      text: model.test 
      onClicked: model.test++ 
     } 
    } 
} 

的QML- get -function期望一個整數,指示索引,其對應於QModelIndex.row。標記在QML中,您將該行作爲屬性,因此.row()將失敗。

你可以選擇使用的是data(index, role)-方法。這需要QModelIndex作爲索引,role作爲整數。這是幸運的,因爲我知道沒有任何方法可以將信號提供的整型角色映射到QML中通常使用的roleName