【发布时间】:2017-07-17 08:35:51
【问题描述】:
我想在不触发附加信号的情况下动态设置 ComboBox 的 currentIndex。
我目前正在使用 bool 属性来设置一个标志,该标志在我的信号被调用时被清除。
Item {
property bool ignoreNextChanged: false
CustomCppItem {
id: customItem
onSomethingHappened: {
ignoreNextChanged = true
comboBox.currentIndex = 42
}
}
ComboBox {
id: comboBox
currentIndex: -1
onCurrentIndexChanged: {
if(ignoreNextChanged) {
ignoreNextChanged = false
return
}
// Removed code here
}
}
}
来自 Qt/C++,我想在这里使用某种QSignalBlocker,而不是我自己的财产。
Qml/QtQuick2 中是否有一些等价物?
【问题讨论】:
-
在不了解更多细节的情况下,试图阻止属性更改信号似乎有点像黑客攻击。你能详细说明你真正想要做什么吗?你可能有一个很好的理由,但可能有更好的方法......
-
在我的例子中,
CustomCppItem是一个 QQuickPaintedItem,它调用了一个用于绘制地图的库。当我从组合框中选择一个项目时,我想告诉 MapItem 应该关注哪个区域。在某些情况下,我会覆盖我不想更改地图焦点的组合框选择。在这些情况下,我将ignoreNextChanged设置为 true。如果这已经是最好的方法,我不会改变它。 -
如何使用信号拦截器清除标志?目前它在您的信号处理程序中被清除。
-
我想我可以在
currentIndex = 42之后立即清除它,对吧? -
@DanielBrunner - 感谢您的解释。即使这都在同一个 QML 文件中,我说这很奇怪的原因是因为地图决定如何对组合框更改做出反应的逻辑是由 ComboBox 项而不是由 map/CusomCppItem 处理的本身。我会设置一个连接,以便
CustomCppItem可以监听comboBox.onCurrentIndexChanged本身(或从onCurrentIndexChanged 抛出的另一个信号)。然后你的地图可以决定如何反应。