QML:是不是可以更改鼠标区域的长持续时间

Posted

技术标签:

【中文标题】QML:是不是可以更改鼠标区域的长持续时间【英文标题】:QML: is it possible to change the long duration of a mouse AreaQML:是否可以更改鼠标区域的长持续时间 【发布时间】:2015-02-25 21:14:10 【问题描述】:

QML 在其 MouseArea 组件中提供 PressAndHold 信号,当鼠标区域被“长时间”按下时 http://doc.qt.io/qt-5/qml-qtquick-mousearea.html#pressAndHold-signal

此持续时间设置为 800 毫秒,我找不到修改此持续时间的方法。 可以做到吗?如果可以,我该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

如果您将看到 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();
        
    

【讨论】:

好的,这很有帮助!非常感谢 您可以通过将Timerrunning 属性设置为parent.pressed 并去掉onPressedonReleased 处理程序来简化它。 有趣的是,即使使用私有 API,即QT += gui_private,也没有直接的setMousePressAndHoldInterval 可用(至少我没有找到它)。我猜这个属性是“魔鬼”:D【参考方案2】:

可以,这个可以直接用setMousePressAndHoldInterval()(added in November 2015)配置,例如:

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

将上述内容放在您的main() 的开头,以及

#include <QStyleHints>

它会根据需要全局设置间隔。

注意 #1:根据 Qt bug report,这是系统范围的配置,因此无法对单个 MouseArea 组件进行微调。

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

【讨论】:

【参考方案3】:

从 Qt 5.9 开始,pressAndHoldInterval 属性会覆盖在发出 pressAndHold 之前经过的时间(以毫秒为单位)。

Documentation

import QtQuick 2.9 // 2.9 or higher

MouseArea 
    pressAndHoldInterval: 100 // duration of 100ms

【讨论】:

以上是关于QML:是不是可以更改鼠标区域的长持续时间的主要内容,如果未能解决你的问题,请参考以下文章

QML PathView:通过鼠标滚轮更改路径视图的当前索引

QML:鼠标区域重叠的问题

QML MouseArea:如何将鼠标事件传播到其他鼠标区域?

Qt QML - 在 QML 中识别超出鼠标区域范围

如何在鼠标事件上更改 QML 的 TableView 中一行的颜色?

如何将鼠标滚轮滚动添加到垂直滚动条或滚动区域?