onClicked和onDoubleClicked都发生在QML中

时间:2015-09-17 21:58:46

标签: qt qml qtquick2

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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

考虑如何实现您的预​​期行为。如果最终双击,为了不发出单击,您需要暂停发出单击直到双击延迟/阈值已经过去,如果没有第二次点击来了,你必须迟到人工发送单击事件。这将是一团糟。