Qt 禁用QML滑块的鼠标滚轮

Qt 禁用QML滑块的鼠标滚轮,qt,qml,qtquick2,qtquickcontrols,Qt,Qml,Qtquick2,Qtquickcontrols,我希望能够使用鼠标滚轮(或触摸板上的两个手指)滚动Flickable,而无需更改滑块s 示例代码和结果应用程序: import QtQuick 2.7 import QtQuick.Window 2.2 import QtQuick.Controls 1.4 ApplicationWindow { id: rootWindow visible: true width: 400 height: 200 title: qsTr("Hello World")

我希望能够使用鼠标滚轮(或触摸板上的两个手指)滚动
Flickable
,而无需更改
滑块
s

示例代码和结果应用程序:

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: rootWindow

    visible: true
    width: 400
    height: 200
    title: qsTr("Hello World")

    ScrollView {
        anchors.fill: parent
        flickableItem.flickableDirection: Flickable.VerticalFlick

        Column {
            Repeater {
                model: 40
                Slider {
                    width: rootWindow.width * 0.9
                }
            }
        }
    }
}

看起来过去有过一些,但没有成功


编辑:这仅与
控件1.x
有关,因为从2.0版本开始,控件似乎没有此问题

您可以在滑块上放置
MouseArea
s来窃取鼠标滚轮事件

大概是这样的:

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: rootWindow

    visible: true
    width: 400
    height: 200
    title: qsTr("Hello World")

    ScrollView {
        id: _scrollview
        anchors.fill: parent
        flickableItem.flickableDirection: Flickable.VerticalFlick

        Column {
            Repeater {
                model: 40
                Slider {
                    width: rootWindow.width * 0.9
                    property int scrollValue: 10

                    MouseArea {
                            anchors.fill: parent
                            onWheel: {
                                //check if mouse is scrolling up or down
                                if (wheel.angleDelta.y<0){
                                    //make sure not to scroll too far
                                    if (!_scrollview.flickableItem.atYEnd)
                                            _scrollview.flickableItem.contentY += scrollValue
                                }
                                else {
                                    //make sure not to scroll too far
                                    if (!_scrollview.flickableItem.atYBeginning)
                                    _scrollview.flickableItem.contentY -= scrollValue
                                }
                            }
                            onPressed: {
                                // forward mouse event
                                mouse.accepted = false
                            }
                            onReleased: {
                                // forward mouse event
                                mouse.accepted = false
                            }
                    }
                }
            }
        }
    }
}
导入QtQuick 2.7
导入QtQuick.Window 2.2
导入QtQuick.Controls 1.4
应用程序窗口{
id:rootWindow
可见:正确
宽度:400
身高:200
标题:qsTr(“你好世界”)
滚动视图{
id:\u滚动视图
锚定。填充:父级
flickableItem.flickableDirection:Flickable.VerticalFlick
纵队{
中继器{
型号:40
滑块{
宽度:rootWindow.width*0.9
属性值:10
鼠耳{
锚定。填充:父级
车轮:{
//检查鼠标是否向上或向下滚动

if(wheel.angle delta.y如果您可行的话,最简单的方法可能是从
QtQuick.Controls 1.4
更改为新的
QtQuick.Controls 2.0

在此版本中,您的问题已得到解决。
为了满足您对
QtQuick.Controls 1.4
的需求,我们将使用别名导入
QtQuick.Controls 2.0

import QtQuick 2.7
import QtQuick.Controls 1.4
import QtQuick.Controls 2.0 as NewCtrl

Column {
    Slider {
        id: oldslider // old slider from QtQuick.Controls 1.4 with your issue
        width: 500
        height: 250
    }

    NewCtrl.Slider {
        id: newsli // new slider without your issue. Both side by side
        width: 500
        height: 30
        wheelEnabled: false // use this to enable or disable the wheel
    }
}
当然,您也可以为旧控件添加别名,并将新控件用作基本控件…或同时使用这两个控件。如您所愿,Hack from为我做了这件事

Slider {
    id: slider
    Component.onCompleted: {
        for (var i = 0; i < slider.children.length; ++i) {
            if (slider.children[i].hasOwnProperty("onVerticalWheelMoved") && slider.children[i].hasOwnProperty("onHorizontalWheelMoved")) {
                slider.children[i].destroy()
            }
        }
    }
}
滑块{
id:滑块
Component.onCompleted:{
对于(变量i=0;i

这可能不适用于其他控件(例如ComboBox)。

您是否尝试了修复?(将
Slider.wheelarea.enabled的值设置为false。)@无法从外部访问
Slider
的maxik
wheelarea
组件。应该可以通过编辑
Slider
的Qt源来更改它,但恐怕我也不能这样做。为什么使用不推荐的QtQuick.Controls 1.4而不是QtQuick.Controls 2.0?谢谢!我可以在上面放置一些东西Slider,但我无法编辑Qt的源代码。我将很快试用它,并让您知道我的结果。添加更多具有相当复杂事件处理程序的对象只是为了解决不推荐使用的模块的功能/错误,对我来说似乎不是一个解决方案。它似乎相当黑客化。如果只重新实现
Slider,可能会更好呃< /代码>完全。有些人甚至会说,这样做总是更好,而不是考虑使用QtQuask.Cube;你是对的,但我需要我的应用程序窗口的菜单栏,该菜单栏在这个版本中由于一些不好的原因被删除。没有人应该阻止你使用菜单栏。幸运的是,你可以同时导入:
import QtQuick.Controls 2.0
import QtQuick.Controls 1.4作为OldCtrl
an,然后使用好的OldCtrl
OldCtrl.menuBar
;-)或者等待Qt 5.8,并希望它在那里。在玩了一点
Controls 2.0
之后,我意识到,当您已经有了基于
Controls 1.x
的中型应用程序时,切换到它并不是那么容易。无论如何,感谢您的回答,谢谢!