- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
文档说我们不能拥有 同号在一个文件中。这意味着我们可以在不同的文件中拥有相同的 id,对吗?我不知道QML中ID的范围,所以我写了如下代码来测试它。
//a.qml
Item {
id: a_item
x:20;
y:b_item.x // cannot access this id
y:b1.x1 // can access
Item {
id:a1
x:20
Component.onCompleted : a1.x //this a1 is a.qml's a1 not the a1 in main.qml
}
}
//b.qml
Item {
id: b_item
x:20;
property int x1: 30;
}
//main.qml
Item {
a {
id:a1
Component.onCompleted : b1.x = 1 //can access
}
b {
id:b1
}
function() {
a_item.x = 1; // cannot access this id
}
}
最佳答案
规范的答案是:
The scope of
id
s is the component scope.
Each QML component in a QML document defines a logical scope. Each document has at least one root component, but can also have other inline sub-components. The component scope is the union of the object ids within the component and the component's root object's properties.
In QML, component instances connect their component scopes together to form a scope hierarchy. Component instances can directly access the component scopes of their ancestors.
id
在 qml 文件中实现有点像该源的根项目的属性。除非它不能通过
someobj.someId
访问,仅通过
someId
.
id
遮挡。或
property
.
a_item
将在
a.qml
中可见以及存在于其根分支中的任何对象
Item
成长。
main.qml
看不到它由于该对象位于树的下方,其中
a_item
没有定义。
b1
可以从
a.qml
访问因为
b1
在
main.qml
中定义这是哪里
a.qml
被实例化。但是
b_item
将要
a1
和
b1
在
main.qml
中定义这是整个应用程序树的根,这两个
id
s 将从应用程序的每个对象可见,只要它是对象树的一部分并且标识符没有被隐藏。请注意,它们在单例对象或无父对象中是不可见的,因为它们不是应用程序对象树的一部分。
obj tree a1 b1 a_item b_item
main.qml D D X X
a.qm V V D X
Item a1 V V V X
b.qml V V X D
D - defined here, V - visible here, X - not available
id
不同。 s 即使它们在不同的子分支上也是可见的,这就是为什么在这个答案的第一句话中我把它作为“实现的那种源的根项目的属性”:
Obj
Obj
Obj
id: objid
property objprop
CustomObj
objid
将在
CustomObj
中可见,但是
objprop
不会,因为它不是一个 id,也不是在根对象中定义的。
id
与这样做相同:
Obj
property objid : _objid
Obj
Obj
id: _objid
id
来自给定源的 s 在 qml 源根对象的上下文中可见,随后所有其他最终会下降到此上下文的所有内容,因为它查找无法解析“更高”上下文中的标识符。
id
如果您确定您的应用程序将在兼容的上下文树中实例化对象,则跨源。
A.qml {
id: objA
B { } // objA will be visible to this object
}
main.qml
A {
B {} // objA will NOT be visible to this object
}
B {} // objA will NOT be visible to this object
// ObjA.qml
Item {
id: objA
Component {
id: cm
ObjB {}
}
function create() { cm.createObject(objA) }
}
// ObjB.qml
Item {
Component.onCompleted: console.log(objA)
}
// main.qml
Component {
id: cm
Rect {}
}
Obj {
anchors.fill: parent
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
if (mouse.button === Qt.LeftButton) {
cm.createObject(parent)
} else {
parent.create()
}
}
}
}
objA
的同一个对象的父对象。标识符,在
main.qml
中创建的对象无法解析它,因为它是在
objA
的上下文中创建的仍然没有定义,但如果对象是在
objA
的上下文中创建的,它就可以工作。 ,即使它在树上被刺得更高,它也会起作用。
id
在源的根对象的上下文中变得可见,并在每个后续子上下文中保持可见,直到它被同名对象遮蔽为止。可见性无法沿着树向下到达在上下文
id
之前存在的上下文。中定义。
a_item
指的是
Item
而
a1
指的是
a
.从
a1
在内部可见
a.qml
它将始终引用
a
的一个实例这是在
main.qml
,无论
a
的哪个实例你可能在,而
a_item
将为
a
的每个不同实例引用不同的对象.
a_item
是“相对的”,并且在
a
的每个不同实例中都会有所不同但是
a1
是绝对的,并且总是指向
a
的特定实例.这是因为
a1
是一个具体实例,而
a_item
是一个类型/原型(prototype)。
// Obj.qml
Item {
id: obj
Component.onCompleted: console.log(obj === oid)
}
// main.qml
Obj { } // false
Obj { id: oid } // true
id
的动态范围s 非常有用,可以减少实现变通方法以访问所需内容所需的时间。这也是为什么提供
id
是一个很好的主意的原因。描述性名称而不仅仅是
main
.
manager
管理多个
views
,每个都有一个
objects
在其中,您可以快速访问各自的
view
每个
object
并且还可以访问经理而无需实现任何额外的东西。经验法则是
manager
必须先来,然后每个
view
应该在
manager
的上下文中创建,不一定直接在其中,但仍然在其中,并且每个
object
应该在
view
的上下文中创建.当然,要注意不要遮蔽事物。如果您违反该规则,事情将无法正确解决。
View.qml { id: view }
manager
view1
object // view is view1
view2
object // view is view2
view3
object // view is view3
id
s 跨源,您应该通过属性、别名等实现更通用的使用接口(interface)。
关于qt - QML中ID的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49311267/
如果下一个元素的宽度超过指定布局的宽度,是否有 QML 布局或某些配置会自动将 QML 项目包装到下一行? 当我使用 QML GridLayout ,项目刚好离开窗口的边缘并被剪裁: GridLayo
如果下一个元素的宽度超过指定布局的宽度,是否有 QML 布局或某些配置会自动将 QML 项目包装到下一行? 当我使用 QML GridLayout ,项目刚好离开窗口的边缘并被剪裁: GridLayo
如何在 qml 文件之间发送变量或信号? http://i.stack.imgur.com/MChCG.png Mainwindow -> 创建组件Item2.qml MainWindow -> 创建
我正在做一些事情,我有一个名为“FloatingMenu”的类(它应该在 C++ 中管理菜单)及其在文件 FloatingMenu.qml 中用于 GUI 的 QML alter-ego。我有一个文件
我正在尝试做一些看似简单的事情,但失败了:定义一个简单的内联文本格式组件,然后用不同的文本多次实例化它。这是代码 Item { . . . Component { id: favButtonL
我可以在页面中使用 InvokeActionItem 轻松共享项目,但我需要能够在 ListView 项目中调用它。我设法触发了一个调用,但我不知道如何在触发它时添加数据。我不断收到错误消息 Invo
我如何在 QML 中检测 Window {} 之外的点击? Rectangle { id: topLevel height: 400; width: 400 Window {
我试过 : var child = grid.children[slot1]; grid.children[slot1] = grid.children[slot2]; grid.children[s
例如,我希望创建一个包含 100 个文本编辑器的 qml 窗口,如何在循环中创建它?那可能吗? 最佳答案 循环是命令式代码,所以它不是 QML,而是 Javascript 或 C++。所以当然,你可以
这是我的 QML 文件,其中包含一个文本组件: import QtQuick 2.0 Item { id: idItmWrapText Text { id: idTxt
我正在寻找一种方法来显示一个文本提示,说明预期的输入作为对用户的建议。以谷歌搜索栏为例: 是否有我缺少的属性,或者这是必须通过脚本来实现的? 最佳答案 Qt Quick 输入项上不存在该属性。您可以为
为 qml 项设置背景的最简单方法是让子矩形的 anchor 完全填满父项: Item { width: 320 height: 240 Rectangle {
我想将属性动态添加到 QML 元素: Item { id: dynamicProperty; property int first; Component.onCompleted: { /*
我用 PySide 和 QML 编写了某种安装程序。按照设计,它必须是多页的。而且我想将要从 QML 表单调用的插槽划分为不同的对象(理想情况下,划分为模块,但据我了解,带有插槽的对象必须继承 QOb
QML 中有没有办法用 opacity: 0 创建一个矩形?仍然有可见的边界?如果没有,有关如何解决它的任何建议? 谢谢 最佳答案 不,不透明度适用于项目的完整视觉方面(并且不透明度:0 使项目完全不
属性变体 a:{}似乎不起作用。 a 最终未定义,而不是一个空字典。 我对 Javascript 不是很有经验...初始化属性以保存空字典的正确方法是什么? 以下 qml 在控制台上打印“qrc:/m
我在 SO 上查看了大量关于 QML 内容边距的问题,但所有答案都指向缺少 spacing: 0 属性。我已经完成了所有这些,但仍然有一些我无法消除的奇怪空间。任何人都可以解释为什么这个 QML 代码
我有一个用于样式定义的 QML 单例,定义如下: pragma Singleton import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQu
这是以下代码的结果: 主.qml import QtQuick 2.8 Item { Reusable { index: 1234 // reusable with
属性变体 a:{}似乎不起作用。 a 最终未定义,而不是一个空字典。 我对 Javascript 不是很有经验...初始化属性以保存空字典的正确方法是什么? 以下 qml 在控制台上打印“qrc:/m
我是一名优秀的程序员,十分优秀!