onClicked 和 onDoubleClicked 都发生在 QML
Posted
技术标签:
【中文标题】onClicked 和 onDoubleClicked 都发生在 QML【英文标题】:onClicked and onDoubleClicked both happen in QML 【发布时间】:2015-09-17 21:58:46 【问题描述】:我已将onClick
和onDoubleClick
处理程序添加到QML 中的一个项目,但是当我双击该区域时这两个事件都会执行。我不知道它是否与检查点击是否由鼠标右键生成有关。此外,放置代码的顺序也不影响问题。
MouseArea
id: idModuleMouseDebug;
parent: repeaterDelegate;
anchors.fill: parent;
acceptedButtons: Qt.LeftButton | Qt.RightButton
onDoubleClicked:
if(mouse.button == Qt.RightButton)
console.log("Double Click");
onClicked:
if(mouse.button == Qt.RightButton)
console.log("Single Click");
【问题讨论】:
似乎是这个bug的回归:bugreports.qt.io/browse/QTBUG-19940 但不清楚,因为它说“当我 双击 单击时,这两个事件都会执行”,这是预期的行为。 @cdonts 我认为这很清楚!如果我点击一次,onClick
就会被调用。如果我双击,onClick
和 onDoubleClick
都会被调用!
哥们,冷静点。你不需要喊出每一句话。当您说“很明显,当我单击一次时,doubleClick 事件不应该上升”时,您显然自相矛盾! - 它不这样做。如果单击一次,则仅打印“单击”。这就是@cdonts 所指出的。此外,它们是正确的:行为是预期的。
【参考方案1】:
你应该对单击使用阈值,像这样:
function singleClick()
print("Single click")
function dblClick()
print("Double Click")
MouseArea
id: idModuleMouseDebug;
parent: repeaterDelegate;
anchors.fill: parent;
acceptedButtons: Qt.LeftButton | Qt.RightButton
Timer
id:timer
interval: 200
onTriggered: singleClick()
onClicked:
if(mouse.button == Qt.RightButton)
if(timer.running)
dblClick()
timer.stop()
else
timer.restart()
【讨论】:
这将导致您点击的时间和界面响应的时间(例如,如果它是一个按钮)之间存在明显的延迟。 @Mitch 我知道,但是 TS 想要拆分单击和双击(据我所知),而单击后双击始终有效。 我希望我永远不必使用这个 UI。 :p @Mitch 错了!微调计时器提供了不错的结果,您不会注意到它 可以毫不拖延地处理!!但在 qml 中。【参考方案2】:正如@cdonts 所说,这是预期的行为,在小部件世界中也是如此:
#include <QtWidgets>
class Widget : public QWidget
public:
Widget()
protected:
void mousePressEvent(QMouseEvent *)
qDebug() << "press";
void mouseReleaseEvent(QMouseEvent *)
qDebug() << "release";
void mouseDoubleClickEvent(QMouseEvent *)
qDebug() << "double click";
;
int main(int argc, char *argv[])
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
输出:
press
release
double click
release
想想您的预期行为将如何实现。如果最终是双击,为了不发出单击,您需要推迟发出单击,直到双击延迟/阈值过去,如果没有第二次单击来了,您必须人为地延迟发送单击事件。这会是一团糟。
【讨论】:
以上是关于onClicked 和 onDoubleClicked 都发生在 QML的主要内容,如果未能解决你的问题,请参考以下文章