QML:是否可以改变鼠标区域的长时间持续时间?

4
3个回答

8

如果你查看MouseArea源代码(Src/qtdeclarative/src/quick/items/qquickmousearea.cpp),你会发现这一行:

d->pressAndHoldTimer.start(qApp->styleHints()->mousePressAndHoldInterval(), this);

时长值来源于QStyleHints,但由于其值是特定于平台的,因此它是只读的。所以对于你的问题:“不”,如果你不打算改变源代码。

但是你仍然可以模拟这些事件,例如:

MouseArea {
    property int pressAndHoldDuration: 2000
    signal myPressAndHold()
    anchors.fill: parent
    onPressed: {
        pressAndHoldTimer.start();
    }
    onReleased: {
        pressAndHoldTimer.stop();
    }
    onMyPressAndHold: {
        console.log("It works!");
    }

    Timer {
        id:  pressAndHoldTimer
        interval: parent.pressAndHoldDuration
        running: false
        repeat: false
        onTriggered: {
            parent.myPressAndHold();
        }
    }
}

好的,这非常有帮助!非常感谢。 - Zed
你可以通过将Timerrunning属性设置为parent.pressed来简化它,并且可以摆脱onPressedonReleased处理程序。 - GrecKo
有趣的是,即使使用私有API,例如QT += gui_private,也没有直接的setMousePressAndHoldInterval可用(至少我没有找到)。我猜这个属性就像“魔鬼”一样:D - BaCaRoZzo
有没有办法取消 onReleased 事件?我已经实现了类似的解决方案,但我想要我的 myPressAndHold 代替 onReleased 信号。 - l.raimondi

5

是的,这可以直接通过setMousePressAndHoldInterval()(自2015年11月起添加)进行配置,例如:

int pressAndHoldInterval = 2000; // in [ms]
QGuiApplication::styleHints()->setMousePressAndHoldInterval(pressAndHoldInterval);

将上述内容放在您的main()开头,连同其他内容一起。
#include <QStyleHints>

它将全局设置所需的间隔。

注意1:根据Qt错误报告,这是系统范围的配置,因此单个MouseArea组件无法进行微调。

注意2:在源代码中,doxygen将其列为\internal,因此可能会在没有警告的情况下被删除/重构。


5

自Qt 5.9以来,属性pressAndHoldInterval覆盖了在发出pressAndHold信号之前经过的毫秒数。

文档

import QtQuick 2.9 // 2.9 or higher

MouseArea {
    pressAndHoldInterval: 100 // duration of 100ms
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接