onClicked和onDoubleClicked都发生在QML中

Sae*_*ani 6 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 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()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望我永远不必使用这个UI.:p (2认同)

Mit*_*tch 4

正如 @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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

press
release
double click
release
Run Code Online (Sandbox Code Playgroud)

想想你的预期行为将如何实施。为了在最终是双击时不发出单击,您需要推迟发出单击,直到双击延迟/阈值过去,如果没有第二次单击,您必须人为地延迟单击事件。这会是一团糟。