2015-05-28 31 views
3

假設我們有一個像QML文件中的以下內容:的項目是不可訪問

Window { 

    Component.onCompleted: rect.color ="green" 

    TabView { 
     Tab { 
      Rectangle { 
       id: rect 
       color: "white" 
      } 
     } 
    } 
} 

當我運行這段代碼,出於某種原因,它給了我這個錯誤:

ReferenceError: rect is not defined

有人會說這是一個範圍問題,但下面的代碼工作正常:

Window { 

    Component.onCompleted: rect.color ="green" 

    Item { 
     Item { 
      Rectangle { 
       id: rect 
       color: "white" 
      } 
     } 
    } 
} 

在我來說,我有一個大表格和標籤裏面和我控制通過所有控制,以多種功能來驗證形式,即一些這樣的代碼:

function onClose() { 
    validate(control1); 
    validate(control2); 
    // etc 
} 

但同時通過id訪問控制I得到上述錯誤。

+0

'Tab'組件確實是'Loader'。只有在選項卡處於活動狀態時纔會創建組件。嘗試將活動設置爲true,然後指定所需的顏色。 – Jairo

+0

正如@Jairo和doc所說:「標籤是懶惰加載的;只有當前標籤(例如,通過點擊它們)纔會有有效的內容。您可以通過設置活動屬性強制加載標籤爲真「。因此,不同'Tab's中的'active:true'應該可以解決你的問題。 – BaCaRoZzo

+1

很好的解決方案,謝謝你們! – folibis

回答

0

如何將矩形綁定到顏色參​​數而不是硬編碼值?

這港島線分開你的模型和視圖代碼進一步使其更項目中的其他地方可讀,以及...試試:

Window { 

    property string myColor: "White" 
    Component.onCompleted: myColor = "Green" 

    TabView { 
     Tab { 
      Rectangle { 
       id: rect 
       color: myColor 
      } 
     } 
    } 

}

查看QML對象樹,你需要以調試模式啓動您的項目。然後拆分代碼窗口,以顯示「Locals and Expressions」視圖(右側勾選複選框)。您將看到您的根項目和所有其他控件嵌套在樹中,現在您可以直接編輯其屬性的值,並且更改將立即呈現。有一個關於調試的YouTube視頻教程:https://youtu.be/mPXn6L2Wftc?t=19m55s

我不確定樹是否可以在運行時訪問控件,但它可能會幫助您進行調試。

+0

正如我所說,我有一個有很多控件的表單,其中大約40個是我認爲的。所以綁定使代碼涉及和過度。 – folibis

+0

您正在傳遞控件以進行驗證 - Views/Forms/Front-end發生了什麼變化?您的驗證碼將中斷,每次更改表單時都需要重寫。您需要將此代碼與前端分開,以便您可以自由更改複雜的前端。我建議你驗證分配給控件的參數,甚至在一個單獨的文件中,而不是試圖通過嵌套控件迭代來訪問這些值。它不像HTML DOM。祝你好運! –

+0

感謝您的建議兄弟,但它不涉及到任務。雖然它會根據MVC強烈構建,我怎樣才能訪問項目insiide'Tab' – folibis

0

OK,既然Tab項目不能從外部訪問,我認爲它可以通過這種方式來完成:

TabView { 
    id: tabView 
    Tab { 
     title: "tab1" 
     function validate() { /* validate all the controls related to tab1 only */ } 
     Item { id: item1 } 
     Item { id: item2 } 
    } 
    Tab { 
     title: "tab2" 
     function validate() { /* validate all the controls related to tab2 only */ } 
     Item { id: item3 } 
     Item { id: item4 } 
    } 
    function validateTabs() { 
     for(var i = 0; i < tabView.count;i ++) { 
      var tab = tabView.getTab(i); 
      if(tab && tab.active && tab.item.validate) { 
       if(!tab.item.validate()) 
        return false; 
      } 
     } 
     return true; 
    } 
} 

好點,如果某些Tab沒有打開,因此沒有改變也不會驗證。