使用 QtQuick.Controls 1.4,当鼠标移到 ComboBox 或 SpinBox Item 上时如何防止焦点改变?

问题描述 投票:0回答:1

我使用一个

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 
                 ...
             }
        }     
    }
}

我该如何继续?

qt focus qml qtquick2
1个回答
1
投票

这是旧的

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 } )
}

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

© www.soinside.com 2019 - 2024. All rights reserved.