пожалуйста, рассмотрите следующий код:
#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?
Я бы обойти обработку события одного клика (используя 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()
может быть слишком долго С другой стороны, с моим решением вы уже увидите значение между первым и вторым кликом на вашем виджете.