onClicked 和 onDoubleClicked 都发生在 QML

Posted

技术标签:

【中文标题】onClicked 和 onDoubleClicked 都发生在 QML【英文标题】:onClicked and onDoubleClicked both happen in QML 【发布时间】:2015-09-17 21:58:46 【问题描述】:

我已将onClickonDoubleClick 处理程序添加到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 就会被调用。如果我双击,onClickonDoubleClick 都会被调用! 哥们,冷静点。你不需要喊出每一句话。当您说“很明显,当我单击一次时,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的主要内容,如果未能解决你的问题,请参考以下文章

React合成事件:onClick或onContextMenu被调用后onDrag不会触发

Qt_Quick开发实战精解_3

❤️HarmonyOS(鸿蒙)❤️——双击事件

双击后在 CListCtrl 中保持高亮显示

jQuery中click和onclick的区别

javascript 中 click 和onclick有啥区别呢