Почему всегда вызывать mousePressEvent перед mouseDoubleClickEvent

Пожалуйста, рассмотрите следующий код:

#include <QWidget>
#include <iostream>
#include <QApplication>

class Widget : public QWidget
{
public:
    void mousePressEvent(QMouseEvent* event)
    {
        std::cout << "mousePressEvent" < std::endl;
    }

    void mouseDoubleClickEvent(QMouseEvent* event)
    {
        std::cout << "mouseDoubleClickEvent" << std::endl;
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Widget w;
    w.show();
    return app.exec();
}

Каждый раз, когда я обрабатываю двойной щелчок, вывод:

mousePressEvent
mouseDoubleClickEvent

Это означает, что Qt всегда вызывает mousePressEvent, как только одно нажатие продолжается, не дожидаясь второго нажатия. Есть ли способ отключить эту опцию, чтобы в случае двойного щелчка никакой вызов mousePressEvent не выполнялся.

3 ответа

Решение

Я бы обойти обработку события одного клика (используя QTimer) на период времени, равный QApplication::doubleClickInterval() значение. Если в течение этого времени не произошло двойного щелчка, я должен обработать "один щелчок", в противном случае двойной щелчок должен быть обработан.

Как говорится в Qt Documentation: реализация по умолчанию mouseDoubleClickEvent генерирует нормальное событие нажатия мыши.

В qwidget.cpp Вы также можете найти комментарий

mouseDoubleClickEvent() вызывается, когда пользователь дважды щелкает мышью в виджете. Если пользователь дважды щелкает мышью, виджет получает событие нажатия мыши, событие отпускания мыши (событие щелчка мыши), второе нажатие мыши, это событие и, наконец, второе событие отпускания мыши.

Почему бы просто не увеличить на единицу в каждой функции события? В случае двойного щелчка счетчик будет увеличиваться в два раза на один.

Более обобщенное решение: исключить изменения, сделанные mousePressEvent вычитая добавленное значение (также может быть отрицательным).

void mousePressEvent(QMouseEvent* event)
{
    counter += singleClickStep;
}

void mouseDoubleClickEvent(QMouseEvent* event)
{
    counter -= singleClickStep;
    counter += doubleClickStep;
}

singleClickStep а также doubleClickStep значения, на которые вы увеличиваете счетчик в каждом случае.

Ответ Vahancho решает случаи, когда вы не можете отменить то, что было сделано одним щелчком мыши, но QApplication::doubleClickInterval() может быть слишком долго С другой стороны, с моим решением вы уже увидите значение между первым и вторым кликом на вашем виджете.

Другие вопросы по тегам