2012-08-09 45 views
4

是否有任何方法檢查存在並訪問QML/javascript中的動態創建對象(不使用C++)?在QML中檢查/訪問動態創建的對象

我試圖創建一個類似於地圖的接口的應用程序 - 給定一個鍵和一個對象,我的應用程序必須定位,如果有關鍵的對象存在並覆蓋新對象。如果沒有,應用程序必須創建一個新對象並與該關鍵字關聯。

該文檔說動態管理的對象沒有ID,我發現訪問它們的唯一方法是使用objectName,這似乎需要C++應用程序。

在此先感謝。

回答

4

您可以使用JavaScript對象作爲地圖。您不能直接在QML中操作它,但是您可以移動所有代碼以將此對象處理爲JavaScript文件並將其作爲模塊包含在內。 下面是一個簡單的例子:

Map.js:

var _map = new Object() 

function value(key) { 
    return _map[key] 
} 

function setValue(key, value) { 
    _map[key] = value 
} 

function remove(key) { 
    delete _map[key] 
} 

function keys() { 
    return Object.keys(_map) 
} 

function process() { 
    for (var key in _map) { 
     /* do something */ 
    } 
} 

QML例如:

import QtQuick 1.1 
import "Map.js" as Map 

Item { 
    Component.onCompleted: { 
     Map.setValue("test", "hello") 
     console.log("test = ", Map.value("test")) 
     Map.remove("test", "hello") 
     console.log("test = ", Map.value("test")) 
    } 
} 

輸出將是:

test = hello 
test = undefined 
+0

它的工作如預期!謝謝。還有什麼辦法來遍歷整個地圖?我需要在同一時間更改所有對象的值... – Ishida 2012-08-13 19:26:54

+0

@Ishida:是的,甚至有兩種方式:)您可以在Map.js函數中定義返回列表,其中包含來自地圖的所有鍵(也可以寫函數,如果需要,它將返回所有值),然後處理該列表。或者你可以直接在Map.js中處理地圖。我更新了兩個函數迭代Map的例子。另外,在process()中,不僅可以通過鍵來迭代,還可以通過值來迭代 - 只需將「for」替換爲「for each」即可。 – 2012-08-14 18:30:43