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]
),也会禁用单击后的
,这样组合框就不再工作了