onClicked 和 onDoubleClicked 都发生在 QML 中

onClicked and onDoubleClicked both happen in QML

我已将 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");
        }
    }
}

正如@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

想想你的预期行为将如何实现。如果 最终 双击,为了不发出单击,您需要推迟发出单击,直到双击 delay/threshold 结束,如果没有第二次点击,您将不得不人为地延迟发送单击事件。会很乱。

您应该使用单击阈值,例如:

{
    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()
            }
        }
    }
}