我在QML中創建可擴展組件時遇到了很多麻煩。有哪些工作技巧,但我想要做的是這樣的:如何將動態內容放置到QML組件中
//Outline.qml
Rectangle {
color: 'red'
//Children are inserted here
}
//main.qml
Rectangle {
...
Outline {
Text { I'm trying to inject this into the Outline component
text: "Hi I'm the inner text!"
}
}
}
我知道我可以通過使用Loader
組件和設置sourceComponent
到Component
實例實現這一目標,但是當我做任何適度複雜的東西(例如可重用的對話框)我寫函數和引用子組件實例的能力受到阻礙。如果組件在同一個QML文件中被實例化,那麼id/function關係就會很好,我可以直接引用我的文本字段。
這裏是裝載機的例子:
//Outline.qml
Rectangle {
id : root
color: 'red'
property Component content;
Loader {
source : root.content
}
}
//main.qml
Rectangle {
function getData(){
return inner.getData();
//ERROR inner is undefined because it is created by the Loader instance.
}
...
Outline {
content: Component {
TextField {
id: inner
function getData(){
return inner.text || 'none';
}
}
}
}
}
我會愛一個更好的方式來處理它。我知道我可以直接在父級內部構建一個組件,並實現頂級參考,但它不允許我正在尋找的控制級別。在這種情況下,組件的「靜態」擴展將是更可取的。
編輯:這裏是一個QML的例子,說明了這個問題。在點擊輸出爲: ReferenceError: getMe is not defined
import QtQuick 2.2
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.1
Item {
id: app
width: 640
height: 480
function accessData(){
output.text = getMe.text
}
Loader {
width: parent.width
height: 300
sourceComponent: Component {
Rectangle {
anchors.fill: parent
color: 'yellow'
TextField {
anchors.centerIn: parent
id: getMe
placeholderText: 'Input data...'
}
}
}
}
Button {
id: button
y: app.height - 50
text: 'get data'
onClicked: {
accessData();
}
}
Text {
y: app.height - button.height
id: output
text: 'none'
}
}
正如你可以看到,當您使用了「裝載機」法sourceComponent是不一樣的樹(你不能訪問內部數據)的一部分。
對於你的'Outline'你在找支持的任何'Component'或特定對象具有特定的角色? – Matthew
我期待支持大綱內的任何組件/項目實例,並對其着陸的位置有一定程度的控制。 –
好的,所以你想要創建自己的佈局類類型?我有一個想法,它有點長,你必須在C++/QML中做到這一點,以便訪問孩子並獲得通知。如果這是你正在尋找的東西,我可以稍後發佈一個答案,當我得到解決方案。 – Matthew