2014-03-04 52 views
12

關於此問題,還有另一個關於Stackoverflow的問題,但我沒有找到可接受的解決方案。所以我再問一次,因爲這個老問題沒有引起注意。包含QML文件中的另一個QML文件

情況就是這樣。我有'main.qml','feature1.qml','feature2.qml'定義的應用程序屏幕。

這些屏幕在標題欄下共享相同的工具欄。工具欄有多個項目,所以複製粘貼QML代碼就像瘋了一樣。這個問題:QML file include - or one monolithic file (structure QML code)?表示只使用QML文件名稱作爲組件名稱是可能的,但我無法使它工作。

任何解決方案?與細節請。

回答

26

讓我們假設你有一個叫main.qml文件,並在名爲MyCustomText.qml另一個文件中的組件。使用前的目錄

// in Main.qml 
Rectangle { 
    id: root 
    MyCustomText { 
    text: "This is my custom text element" 
    } 
} 

如果MyCustomText.qml是另一個子目錄MyComponents例如將所有的自定義組件一起,你首先需要import:如果兩個文件都在同一個目錄中,您直接可以加載組件這樣該組件以同樣的方式:

// in Main.qml 
import "MyComponents" 

Rectangle { 
    id: root 
    MyCustomText { 
    text: "This is my custom text element" 
    } 
} 

需要注意的另一個重要的事情是,你的QML文件應該總是以一個大寫字母,如果你希望能夠使用他們這種方式啓動

當然,您的Loader解決方案也可以工作,但這是在其他組件中導入QML文件的最簡單方法。

+0

我仍然更喜歡使用Loader的解決方案,基於linux的coz im,文件路徑應該是小寫的 – jondinham

+0

@PaulDinham Linux中沒有關於文件或目錄名稱的情況。此外,QML不是C++,它是它自己的語言,在Linux上完成的大部分開發我都敢打賭。你「應該」遵循語言慣例。 – hyde

+0

我的意思是一般的linux文件名,dir名字是小寫的 – jondinham

2

最後我從網上挖出來。比方說,要被包含的文件是在這個目錄結構(Qt Quick的) 'mycomponent.qml':

projectdir/ 
    qml/ 
    projectname/ 
     main.qml 
     mycomponent.qml 

'mycomponent.qml'(例如)的內容:

Text { 
    text:"Hello, Scooby Doo!"; 
} 

,我們需要加載這種方式(在「main.qml」):

Rectangle { 
    ... 
    Loader { 
    source:"mycomponent.qml"; 
    } 
    ... 
} 
+0

注意:當沒有實際的理由使用'Loader'時,這個不必要的複雜化。它不應該用於可以直接將組件名稱「靜態」寫入QML的情況。 – hyde

+1

有一個使用Loader的情況:qml文件位於另一個目錄中,但是這可以通過使用'import'來解決 – jondinham

1

See Qt documentation about reuseable components.

導入QML文件定義了類型的名稱相同的文件名(大寫,少了.qml後綴)。 QML將類型稱爲可重用組件。您可以使用該類型名稱來實例化導入QML文檔(文件)中的對象。

它不像C語言包含,其中包含文件的文本被插入到包含文件中。它更像是在Python中導入類的名稱,然後在導入文件中實例化該類的對象。或者有點類似於Javascript,導入的文件正在創建一個原型對象,並且導入文件是原型繼承的。除了注意關於根對象的討論以及組件的哪些屬性將會顯示(因爲QML的文檔範圍)。您將無法訪問導入文件中的所有內容,就好像它是C include,Python導入,或JS繼承。

相關問題