Различать события одиночного и двойного кликов в Qt
У меня есть QAbstractItemView
, который должен реагировать на события с одним и двумя щелчками. Действия различаются в зависимости от того, было ли одно нажато или дважды нажато. Возникающая проблема заключается в том, что событие с одним кликом получено до события двойного щелчка.
Есть ли рекомендуемый способ/наилучшая практика для различения этих двух? Я не хочу выполнять одно действие щелчка, когда пользователь фактически дважды нажал.
Я использую Qt 4.6
Ответы
Ответ 1
Вы можете найти ответ в потоке Двойной щелчок по захвату на QtCentre форум;
У вас может быть таймер. Начать таймера в обработчике releaseEvent и убедитесь, что тайм-аут достаточно длинный сначала обработать двойной щелчок. Затем в событии двойного щелчка вы можете остановить таймер и предотвратить его обстрел. Если двойной обработчик клика не запускается, таймер отключится и вызовет слот ваш выбор, где вы можете справиться с один клик. Это, конечно, неприятный взломать, но имеет шанс работать.
wysotap >
Ответ 2
Это хороший дизайн пользовательского интерфейса, чтобы убедиться, что ваши клики и двойные щелчки концептуально связаны между собой:
Single-Click: select icon
Double-Click: select icon and open it
Single-Click: select color
Double-Click: select color and open palette editor
Обратите внимание, что в этих примерах действие с одним щелчком на самом деле является подмножеством двойного щелчка. Это означает, что вы можете продолжить и выполнить однократное нажатие, и просто выполните дополнительные действия, если приходит двойной щелчок.
Если ваш пользовательский интерфейс делает что-то вроде:
Single-Click: select icon
Double-Click: close window
Затем вы настраиваете своих пользователей на провал. Даже если они помнят, что делает один щелчок по сравнению с двойным щелчком все время, очень легко случайно сдвинуть мышь слишком далеко, дважды щелкнув или подождите слишком долго.
Edit:
Мне жаль это слышать.
В этом случае я нашел эти две статьи полезными:
Ответ 3
Используя PySide, который является связыванием Python Qt 4.8, я увидел, что одиночные клики доставляют событие QEvent.MouseButtonPress
, а двойные клики обеспечивают одно событие QEvent.MouseButtonPress
, за которым следует QEvent.MouseButtonDblClick
. Задержка примерно равна 100ms
в Windows. Это означает, что у вас все еще есть проблема, если вам нужно различать однократные и двойные щелчки.
Для решения требуется еще один QTimer
со слегка более высокой задержкой, чем встроенная задержка (добавление некоторых служебных данных). Если вы наблюдаете событие QEvent.MouseButtonPress
, вы запускаете свой собственный таймер, а в случае таймаута - один клик. В случае QEvent.MouseButtonDblClick
это двойной щелчок, и вы останавливаете таймер, чтобы не считать один клик.