Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt onClicked和onDoubleClicked都发生在QML中_Qt_Qml_Qtquick2 - Fatal编程技术网

Qt onClicked和onDoubleClicked都发生在QML中

Qt onClicked和onDoubleClicked都发生在QML中,qt,qml,qtquick2,Qt,Qml,Qtquick2,我已经将onClick和onDoubleClick处理程序添加到QML中的一个项目中,但是当我双击该区域时,这两个事件都会执行。我不知道这是否与检查点击是否由鼠标右键生成有关。此外,放置代码的顺序也不会影响问题 MouseArea { id: idModuleMouseDebug; parent: repeaterDelegate; anchors.fill: parent; acceptedButtons: Qt.LeftButton | Qt.RightBut

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

正如@cdonts所说,这也是widgets世界的预期行为:

#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();
}

想想你预期的行为将如何实现。为了在最终是双击时不发出单键单击,您需要推迟发出单键单击,直到双击延迟/阈值过去,如果没有第二次单击,则必须人工延迟发送单键单击事件。这将是一片混乱。

您应该使用阈值进行单击,如下所示:

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

似乎是这个错误的回归:但不清楚,因为它说“双击时两个事件都会执行”,这是预期的行为。@cdonts我想这是清楚的!如果单击一次,将调用
onClick
。如果我双击,
onClick
onDoubleClick
都会被调用!伙计,冷静点。你不需要喊每一句话。当你说“很明显,当我点击一次时,双击事件不应该出现!”时,你显然自相矛盾-它没有这样做。如果单击一次,则只打印“单次单击”。这就是@cdonts所指出的。此外,它们是正确的:行为是预期的。这将导致您单击的时间与界面响应的时间之间出现明显的延迟(例如,如果是按钮)。@Mitch我知道,但TS希望将单击和双击分开(据我所知)虽然双击总是在单击后工作。我希望我永远不必使用此UI:p@Mitch错了!微调计时器可以提供很好的效果,您不会注意到它
{
    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()
            }
        }
    }
}