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
的maxikwheelarea
组件。应该可以通过编辑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,然后使用好的OldCtrlOldCtrl.menuBar
;-)或者等待Qt 5.8,并希望它在那里。在玩了一点Controls 2.0
之后,我意识到,当您已经有了基于Controls 1.x
的中型应用程序时,切换到它并不是那么容易。无论如何,感谢您的回答,谢谢!