我使用一个
ListView
,并且在这个Item
的每个ListView
内,我有一个ComboBox
或一个SpinBox
。
我的问题是,当我想要
scroll
我的ListView
时,如果我的mouse
继续ComboBox
或SpinBox
,focus
将会改变,scroll
现在会在此 Item
而不是列表。
我希望仅当我单击这些项目时,焦点才会设置在这些项目上。
代码示例:
import QtQuick.Controls 1.4
ListView {
id: list
ScrollBar.vertical: ScrollBar {}
...
model: DelegateModel {
id:delegate
model: myModel
delegate : Rectangle {
id: rect
...
SpinBox {
id: spin
...
}
}
}
}
我该如何继续?
这是旧的
QtQuick.Controls 1.x
组件的一个常见问题,它们贪婪地抓取鼠标事件。据我所知,没有官方方法可以防止这种情况发生。
在这里您可以找到一个解决方案,关于如何将这样的组件(在本例中为
Slider
)与MouseArea
覆盖以防止这种不当行为。
或者,您可以切换到新的
QtQuick.Controls 2.x
-Spinbox。由于它具有不同的默认外观,您可能需要对其进行调整,以使其看起来(更)类似于旧的外观。 在这里您可以找到有关如何执行此操作的说明。
请记住,通过使用别名导入,可以轻松地将
QtQuick.Controls 1.x
和 QtQuick.Controls 2.x
包含在一个文件中。
深入研究
QtQuick.Controls 1.4
的来源,我们还可以找到一个hacky解决方案。
相关文件:
我们可以看到,一个
SpinBox
就是一个Control
。 SpinBox
有一个子 MouseArea
,它处理 onWheel
事件。我们要禁用这个MouseArea
。要访问它,我们需要知道 SpinBox.children
中的索引。我们在 Control
中看到有两个 Loader
作为子项(索引 0 和 1)。在 SpinBox
中,我们在 MouseArea
之前还有另外两个子级(索引 2 和 3)-> 因此,我们需要设置 idOfSpinBox.children[4].enabled = false
来禁用滚轮灵敏度。
import QtQuick 2.7
import QtQuick.Controls 1.4
ApplicationWindow {
id: root
visible: true
width: 800
height: 600
ListView {
model: 20
width: 100
height: 200
delegate: SpinBox {
Component.onCompleted: children[4].enabled = false
}
}
}
或者如果我们想启用滚轮,当单击
SpinBox
时,我们使用:
delegate: SpinBox {
id: spinBox
Component.onCompleted: children[4].enabled = Qt.binding(function() { return spinBox.activeFocus } )
}
但是我们需要找到一些方法来再次失去这个焦点。