【发布时间】:2015-02-25 21:14:10
【问题描述】:
QML 在其 MouseArea 组件中提供 PressAndHold 信号,当鼠标区域被“长时间”按下时 http://doc.qt.io/qt-5/qml-qtquick-mousearea.html#pressAndHold-signal
此持续时间设置为 800 毫秒,我找不到修改此持续时间的方法。 可以做到吗?如果可以,我该怎么做?
谢谢!
【问题讨论】:
QML 在其 MouseArea 组件中提供 PressAndHold 信号,当鼠标区域被“长时间”按下时 http://doc.qt.io/qt-5/qml-qtquick-mousearea.html#pressAndHold-signal
此持续时间设置为 800 毫秒,我找不到修改此持续时间的方法。 可以做到吗?如果可以,我该怎么做?
谢谢!
【问题讨论】:
如果您将看到 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();
}
}
}
【讨论】:
Timer 的running 属性设置为parent.pressed 并去掉onPressed 和onReleased 处理程序来简化它。
QT += gui_private,也没有直接的setMousePressAndHoldInterval 可用(至少我没有找到它)。我猜这个属性是“魔鬼”:D
可以,这个可以直接用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,因此可能会在没有警告的情况下将其删除/重构。
【讨论】:
从 Qt 5.9 开始,pressAndHoldInterval 属性会覆盖在发出 pressAndHold 之前经过的时间(以毫秒为单位)。
import QtQuick 2.9 // 2.9 or higher
MouseArea {
pressAndHoldInterval: 100 // duration of 100ms
}
【讨论】: