gpt4 book ai didi

android - 在 Android 上从 MouseArea 双击幻影

转载 作者:行者123 更新时间:2023-11-29 19:26:39 25 4
gpt4 key购买 nike

在 Android 上测试应用程序时,我注意到发生了一些奇怪的事情。双击事件处理程序已触发,但该特定项目没有发生任何双击。

试图隔离这个问题,我发现几乎每一个点击链都像双击一样快速,不管两个对象会导致对第二个对象的第二次点击注册为双击,而实际上它只是一个单击。

下面的示例由一行 3 个随机着色的矩形组成,每个矩形内都有一个鼠标区域。双击每个鼠标区域可将父矩形的颜色设置为不同的随机颜色。在 android 下快速单击两个不同的矩形会触发双击和第二次颜色变化。这不会发生在 Windows 或 Ubuntu Linux 上。

Window {
id: main
visible: true
width: 400
height: 400
title: qsTr("Hello World")

Row {
Rectangle {
width: main.width * .33
height: main.height
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
border.color: "black"
border.width: 2
MouseArea {
anchors.fill: parent
onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
}
}
Rectangle {
width: main.width * .33
height: main.height
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
border.color: "black"
border.width: 2
MouseArea {
anchors.fill: parent
onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
}
}
Rectangle {
width: main.width * .33
height: main.height
color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
border.color: "black"
border.width: 2
MouseArea {
anchors.fill: parent
onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
}
}
}
}

看起来好像“上一次点击”或任何应该用于检测双击的属性在不同的鼠标区域之间共享,而不是每个鼠标区域共享。该问题同时出现在 Qt 5.7 和 5.7.1 中。

这确实是我今年发现的第 10 个 Qt 错误,但我仍然想趁机问问有人知道发生了什么以及如何修复它,因为我需要这个修复,而且 Qt 错误报告过程并不快.所以任何想法都非常受欢迎。

最佳答案

在找到更好的实际解决方案之前,了解通过减少双击检测的全局间隔可以在一定程度上减轻此问题对用户体验造成的破坏性影响可能会很有用。

默认情况下,它是相当昏昏欲睡的 500 毫秒。我发现将它减少到 250 毫秒有助于避免超过 90% 的错误双击:

QGuiApplication app(argc, argv);
app.styleHints()->setMouseDoubleClickInterval(250);

此外,还有一种快速而笨拙的 qml-only 方法来创建 MouseArea 的“固定”副本:

// MArea.qml
Item {
id: main
property alias mouseX : ma.mouseX
property alias mouseY : ma.mouseY
property alias acceptedButtons: ma.acceptedButtons
// etc aliases
signal clicked(var mouse)
signal doubleClicked(var mouse)
// etc signals, function accessors
MouseArea {
id: ma
property real lClick : 0
anchors.fill: parent
onClicked: {
var nc = Date.now()
if ((nc - lClick) < 500) main.doubleClicked(mouse)
else main.clicked(mouse)
lClick = nc
}
}
}

这个实际上可以按预期工作,并且可以几乎完全与原始版本“即插即用”兼容。

关于android - 在 Android 上从 MouseArea 双击幻影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41214169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com