qt - 当一个项目从不同文件中的不同项目访问相同的值时,属性绑定在 Qml 中丢失
问题描述
StackOverflow 上有一堆 Qml Properties 问题,它们都与同一个文件中的项目相关,并且可以通过直接使用 Connections 或 Binding 轻松解决。但是如果 Qml 对象由于缺少绑定而失去与外部的连接会发生什么?
我创建了一个“Spinner Slider”,它是一个 Spinner 和一个具有相同值的 Slider:
SpinnerSlider.qml
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.3
RowLayout {
id: root
property alias value: sliderControl.value
property alias from: sliderControl.from
property alias to: sliderControl.to
Slider {
id: sliderControl
Layout.fillWidth: true
stepSize: 1
wheelEnabled: true
}
SpinBox {
id: spinBox
from: root.from
to: root.to
value: root.value
stepSize: sliderControl.stepSize
editable: true
onValueChanged: root.value = value
}
}
我想以下列方式使用,两个滑块,一个在另一个之上。修改顶部应该改变底部的值,改变底部的值应该什么都不做。
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
Column {
anchors.fill: parent
SpinnerSlider {
id: outerSlider
from: 0
to: 500
value: 50
}
SpinnerSlider {
id: innerSlider
from: 0
to: 500
// Does Not Work
// value: outerSlider.value
// Works
Connections {
target: outerSlider
onValueChanged: innerSlider.value = outerSlider.value
}
// Works
Binding on value {
value: outerSlider.value
}
}
}
}
根据代码中的注释,如果我使用“通常”的方式在 Qml 上连接事物,value: something.value
一旦我更改 SpinBox 上的值,代码将无法工作,因为这onValueChange
将触发并且我将删除属性绑定有效地为其设置一个常数。
我真正想要的是能够使用value: outerSlider.value
我尝试过的方式:Connections、Qt.bindings、Bindings on.. 在 SpinnerSlider.qml 中,但似乎没有任何效果。有什么提示吗?
解决方案
我设法通过Binding on
多次使用来修复代码。这样我就不会破坏外部绑定。
Binding on value {
when: sliderControl.pressed
value: sliderControl.value
}
Binding on value {
when: spinBox.up.pressed
value: spinBox.value
}
Binding on value {
when: spinBox.down.pressed
value: spinBox.value
}
Binding on value {
when: spinBox.focus
value: spinBox.value
}
推荐阅读
- python - 如何显示通过文件对话框选择的图像(在画布上)?
- gimp - 脚本不使用定义的路径
- java - 尝试在第 4 次安装命令中为 J2ObjC 安装 Protobuf 时出错
- python - 使用 pygame 退出 python 脚本
- java - Ameritrade API POST 请求 JSON 响应
- c++ - 使用 C++ 在屏幕上绘图
- sql - MariaDB 复制表内的行
- python-3.x - 如何在 Python 中将字节和字节流连接成字节流?
- npm - 运行第一个 Jest/Puppeteer 测试时出现 TypeError
- reactjs - React - axios - 被 CORS 策略阻止。如何解除封锁