我想通过ID从主文件访问我的QML元素,但是它不起作用。在我的测试(案例)环境中,我有2个文件:
main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
Item {
Accounts {
id: accounts
}
Component.onCompleted: {
console.log(accounts);
console.log(accounts.accounts_pane);
console.log(accounts.list_area);
console.log(accounts.accounts_pane.list_area.list_column.list_identities.model);
}
}
Run Code Online (Sandbox Code Playgroud)
Accounts.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
Pane {
id: accounts_pane
anchors {
fill: parent
}
Rectangle {
id: list_area
border.color: "black"
border.width: 2
anchors {
left: parent.left
right: parent.right
top: parent.top
bottom: parent.bottom
}
Column {
id: list_column
ListView {
id: list_identities
width: list_area.width
height: 200
model: ListModel {
ListElement {
name: "Bill Smith"
number: "555 3264"
}
ListElement {
name: "John Brown"
number: "555 8426"
}
}
delegate: Text {
text: name + ',' + number
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,从main.qml文件中,我想更改帐户的模型(不同的公司使用不同的帐户),并且需要使用Javascript来完成。(我的模型是C ++类,已在QML引擎中注册,但是我将使用Javascript来切换不同的模型对象)。据我了解,访问模型的符号应类似于以下内容:
accounts.accounts_pane.list_area.list_column.list_identities.model
Run Code Online (Sandbox Code Playgroud)
但是,在进行测试时,请使用console.log():
console.log(accounts);
console.log(accounts.accounts_pane);
console.log(accounts.list_area);
console.log(accounts.accounts_pane.list_area.list_column.list_identities.model);
Run Code Online (Sandbox Code Playgroud)
我无法通过Accounts.qml中定义的Pane {}元素。的输出qmlscene
显示了这些错误:
hier $ qmlscene main.qml
qml: QQuickPane(0x13b85f0)
qml: undefined
qml: undefined
file:///QT_snippets/qmlscenes/hier/main.qml:13: TypeError: Cannot read property 'list_area' of undefined
Run Code Online (Sandbox Code Playgroud)
如何从main.qml文档中通过ID任意访问QML元素?
最好只使用 id 来访问同一个 QML 文件中的对象。也可以通过 id 访问对象,只要您处于嵌套在具有 id 的组件内的组件范围内,只要它没有被任何具有相同名称的东西遮蔽。简而言之,id 只能从内部访问,而不能从外部访问,后者是您的使用场景。
如果要访问其他 QML 文件中的元素,则必须将它们作为属性公开。此外,在根 QML 文件中定义的属性将在整个项目中可见,只要具有相同名称的属性遮蔽它即可。
将 QML 文件中的每个对象视为私有的,而属性是公共的。如果您想访问其中一个私有对象,请将其作为属性公开。
property Item someItem : _item
Item { id: _item }
Run Code Online (Sandbox Code Playgroud)
在您的情况下accounts_pane
是多余的,因为它将与accounts
- 它是同一个对象相同。
如果list_identities
直接公开,则无需公开所有先前的对象即可访问它:
accounts.accounts_pane.list_area.list_column.list_identities.model // no need
accounts.list_identities.model // all you need
Run Code Online (Sandbox Code Playgroud)
此外,您可以将特定对象的特定属性公开为别名:
// in Accounts.qml
property alias model: list_identities.model
// then you can simply
accounts.model
Run Code Online (Sandbox Code Playgroud)
最后,认为这种方法是错误的,您不需要公开所有内容供外部使用,您应该定义一个接口来控制每个 QML 组件的内部结构。
组件的接口包含它定义的所有顶级属性。
归档时间: |
|
查看次数: |
2491 次 |
最近记录: |