我使用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
...
}
}
}
}
我该怎么办?
答案 0 :(得分:1)
这是旧QtQuick.Controls 1.x
组件的常见问题,他们贪婪地抓住鼠标事件。据我所知,没有官方方法可以阻止这种情况。
Here您找到了一个解决方案,了解如何使用Slider
覆盖此类组件(在本例中为MouseArea
),以防止此行为异常。
或者,您可以切换到新的QtQuick.Controls 2.x
- Spinbox。由于它有不同的默认外观,您可能需要调整它,看起来(更多)类似于旧的。 Here您可以找到有关如何执行此操作的说明。
请记住,通过使用别名导入它们,可以很容易地在一个文件中同时使用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 } )
}
但是我们需要找到一些方法再次失去这个焦点。