Подтвердить что ты не робот

Различать события одиночного и двойного кликов в Qt

У меня есть QAbstractItemView, который должен реагировать на события с одним и двумя щелчками. Действия различаются в зависимости от того, было ли одно нажато или дважды нажато. Возникающая проблема заключается в том, что событие с одним кликом получено до события двойного щелчка.

Есть ли рекомендуемый способ/наилучшая практика для различения этих двух? Я не хочу выполнять одно действие щелчка, когда пользователь фактически дважды нажал.

Я использую Qt 4.6

4b9b3361

Ответ 1

Вы можете найти ответ в потоке Двойной щелчок по захвату на QtCentre форум;

У вас может быть таймер. Начать таймера в обработчике releaseEvent и убедитесь, что тайм-аут достаточно длинный сначала обработать двойной щелчок. Затем в событии двойного щелчка вы можете остановить таймер и предотвратить его обстрел. Если двойной обработчик клика не запускается, таймер отключится и вызовет слот ваш выбор, где вы можете справиться с один клик. Это, конечно, неприятный взломать, но имеет шанс работать.

wysota​​p >

Ответ 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 это двойной щелчок, и вы останавливаете таймер, чтобы не считать один клик.