Qml滚动不服从Windows鼠标设置

时间:2019-07-15 14:27:56

标签: qt scroll qml

从默认的Qt 5.12.4-“ Qt快速Qpplication-滚动”中,模型从20修改为200。

dir | Rename-Item -NewName {$_.Basename + ' 2013' + $_.Extension} -whatif

在Qt Creator以及大多数浏览器和其他应用中,更改“选择每次滚动多少行”会立即生效,但在此无效。

Mouse settings screenshot

如何使我的应用程序表现得与众不同?

1 个答案:

答案 0 :(得分:1)

深入研究Qt文档后,我发现了以下可能的解决方法。

首先,您需要使用应用程序的QStyleHints在Windows控制面板中确定鼠标设置。然后,您需要将wheelScrollLines属性转移到您的qml组件。

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QStyleHints>
#include <QQuickView>
#include <QVariant>

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    QQmlContext* context = engine.rootContext();
    auto scrollLines =QVariant::fromValue(app.styleHints()->wheelScrollLines());
    qDebug() << scrollLines;
    context->setContextProperty("scrollLines", scrollLines);
    engine.load(QUrl("./data/main.qml"));
    return app.exec();
}

在您的qml组件内部,真正有趣的地方将开始。您需要根据您的flickDeceleration和项目代表高度来设置属性maximumFlickVelocityscrollLines

不幸的是,鉴于这两个属性,似乎没有文档可以为您提供要滚动的像素的确切数量。因此,必须依靠Qt框架内的猜测或调试。如果以像素/秒为单位的速度发生变化,则会将其写入控制台。这可能会给您一个线索。

import QtQuick 2.12
import QtQuick.Controls 2.5

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Scroll")

    ScrollView {
        anchors.fill: parent

        ListView {
            width: parent.width
            model: 200
            property double pixelsToScroll: 100*scrollLines

            flickDeceleration: -0.5*(maximumFlickVelocity*0.25)*(maximumFlickVelocity*0.25)/pixelsToScroll
            onVerticalVelocityChanged : console.log(verticalVelocity)
            maximumFlickVelocity: 2000 // Pixels per Second??? maximumFlickVelocity*0.25 seems to be the initial velocity
            delegate: ItemDelegate {            
                text: "Item " + (index + 1)
                width: parent.width
                height: 100
            }
        }
    }
}