Qt 如何防止鼠标在组合框或旋转框项目上移动时焦点改变
我使用一个Qt 如何防止鼠标在组合框或旋转框项目上移动时焦点改变,qt,focus,qml,qtquick2,Qt,Focus,Qml,Qtquick2,我使用一个列表视图,在该列表视图的每个项中,我有一个组合框或旋转框 我的问题是,当我想滚动我的列表视图时,如果我的鼠标进入组合框或旋转框,焦点将改变,滚动现在将在这个项目上,而不是在列表上 我希望仅当我单击这些项目时,才将焦点设置在这些项目上。 代码示例: import QtQuick.Controls 1.4 ListView { id: list ScrollBar.vertical: ScrollBar {} ... model: DelegateMode
列表视图
,在该列表视图
的每个项
中,我有一个组合框
或旋转框
我的问题是,当我想滚动我的列表视图时,如果我的鼠标进入组合框或旋转框,焦点将改变,滚动现在将在这个项目上,而不是在列表上
我希望仅当我单击这些项目时,才将焦点设置在这些项目上。
代码示例:
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
组件的一个常见问题,它们贪婪地抓取鼠标事件。据我所知,没有官方的方法来防止这种情况
您可以找到一个解决方案,即如何将此类组件(在本例中为滑块
)与鼠标earea
重叠,以防止这种错误行为
或者,您可以切换到新的QtQuick.Controls 2.x
-Spinbox。由于它具有不同的默认外观,您可能需要调整它,使其看起来(更)类似于旧的外观。您可以找到有关如何执行此操作的说明
请记住,通过使用别名导入,很容易将两个控件:QtQuick.Controls 1.x
和QtQuick.Controls 2.x
都包含在一个文件中
深入研究QtQuick.Controls 1.4
的源代码,我们还可以找到一个黑客解决方案
相关文件:
我们可以看到,SpinBox
是一个控件
。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 } )
}
但是,我们需要找到一些方法来再次失去关注。您的SpinBox
是QtQuick。控件1.x或2.x?我使用导入QtQuick。控件1.4
感谢您的完整答案。我尝试了这两个例子,效果都很好。但是,此时我需要使用QtQuick.Controls 1.x
,因为QML
部分将是“经典”QWidget
应用程序的一部分,并且我需要一些组件具有“经典”外观。它可能会在未来发生变化。添加了一些其他方式,通过检查SpinBox
的源代码-我希望它有帮助。您好,感谢您深入了解源代码,它对SpinBox有效,是一个很好的解决方案。但是,我尝试将此解决方案应用于组合框
,但是如果禁用MouseArea
(children[2]
),也会禁用单击后的,这样组合框就不再工作了