当鼠标进入ComboBox或SpinBox项时,如何防止焦点更改

时间:2017-05-17 08:30:51

标签: qt focus qml qtquick2

我使用ListView并在Item的每个ListView内,我有ComboBoxSpinBox

我的问题是,当我想要scroll我的ListView时,如果我的mouse继续ComboBoxSpinBox 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 
                 ...
             }
        }     
    }
}

我该怎么办?

1 个答案:

答案 0 :(得分:1)

这是旧QtQuick.Controls 1.x组件的常见问题,他们贪婪地抓住鼠标事件。据我所知,没有官方方法可以阻止这种情况。

Here您找到了一个解决方案,了解如何使用Slider覆盖此类组件(在本例中为MouseArea),以防止此行为异常。

或者,您可以切换到新的QtQuick.Controls 2.x - Spinbox。由于它有不同的默认外观,您可能需要调整它,看起来(更多)类似于旧的。 Here您可以找到有关如何执行此操作的说明。

请记住,通过使用别名导入它们,可以很容易地在一个文件中同时使用QtQuick.Controls 1.xQtQuick.Controls 2.x

深入研究QtQuick.Controls 1.4的来源,我们也可以找到一个hacky解决方案。

相关文件:

我们可以看到,SpinBoxControlSpinBox有一个子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 } )
}

但是我们需要找到一些方法再次失去这个焦点。