2017-05-04 48 views
1

我有一個較大的QML項目,我試圖重構,以便某些相關組件位於其自己的文件中。在我的簡單示例中,的一部分是什麼ThingManager.qml以前只是簡單包含在main.qml文件中。前重構,ID的範圍,一個b,和Ç是可見的,以page.qml,因爲它們在主文件中定義。當我試圖抽象這些成ThingManager內容,以減少在我main.qml雜波,page.qml不再能夠引用那些與familar作用域錯誤:重構QML並將組件保持在範圍內

page.qml:9: ReferenceError: a is not defined

鑑於我加載類似於page.qml的頁面,並希望在這些組件中執行存儲在另一個文件中的方法,建議如何重構類似此示例的方法,以便page.qml可以訪問這些組件中的方法,而不必在main .qml?或者那根本就不可能做到?

main.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.1 
import QtQml 2.2 

ApplicationWindow { 
    id: window 

    ThingManager { } 

    Loader { 
      id: page_loader 
    } 

    Component.onCompleted: { 
      page_loader.setSource("page.qml") 
    } 
} 

ThingManager.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.1 
import QtQuick.Layouts 1.3 

Item { 
    Column { 
      Button { 
        id: a 
        text: "A" 
      } 
      Button { 
        id: b 
        text: "B" 
      } 
      Button { 
        id: c 
        text: "C" 
      } 
    } 
} 

page.qml:

import QtQuick 2.7 
import QtQuick.Controls 2.1 

Page { 
     id: page 

     Component.onCompleted: { 
       console.log("Execute A's method") 
       a.toggle() 
     } 
} 
+0

您應該添加一個id爲'ThingManager'和定義別名'了'作爲'ThingManager.qml'的屬性。 – m7913d

+0

好的,謝謝!那是我需要的組合。我試圖應用一個屬性別名,但放置在ThingManager.qml id而不是導致其他錯誤的實例。不幸的是,我沒有特權將您的評論標記爲答案,否則我會這麼做。至少,我可以將更新後的代碼作爲答案發布給您的評論。 – ohporter

+0

我將其添加爲答案,包括解決方案的草圖。 – m7913d

回答

1

你應該ThingManager.qml如下添加一個id ThingManager並定義a作爲別名屬性:

main.qml

... 
ThingManager {id: manager } 
... 

ThingManager.qml

Item { 
    property alias a: a // makes 'a' available outside this file 
    property alias b: b 
    property alias c: c 

    ... 
} 

page.qml

... 
manager.a.toggle() 
... 
相關問題