2011-01-07 12 views
11

Tengo un QAbstractItemView que debe reaccionar ante eventos de un solo clic y doble clic. Las acciones son diferentes dependiendo de si se hizo un solo clic o se hizo doble clic. El problema que está ocurriendo es que el evento de un solo clic se recibe antes del evento de doble clic.Distinga entre eventos de clic simple y doble en Qt

¿Existe alguna manera recomendada/mejor práctica para distinguir entre los dos? No quiero realizar la acción de un solo clic cuando el usuario ha hecho doble clic.

estoy usando Qt 4.6

Respuesta

6

puede encontrar respuesta en el hilo titulado Double Click Capturing en QtCentre foro;

Puede tener un temporizador. Inicie el temporizador en el controlador releaseEvent y asegúrese de que el tiempo de espera sea lo suficientemente largo para manejar primero el doble clic. Luego, en el evento de doble clic manejador puede detener el temporizador y evitar que se dispare. Si no se activa un manipulador de clic doble , el temporizador expirará y llamará a un intervalo de a su elección, donde puede manejar el con un solo clic. Esto es, por supuesto, un truco desagradable , pero tiene la oportunidad de funcionar.

wysota

+0

Funciona, pero por supuesto crea un retraso en la experiencia del usuario cuando se hace clic solo. Cualquier cosa que suceda con un solo clic parecerá tomar un tiempo "largo" (QApplication :: doubleClickInterval()), por lo que la aplicación parece lenta. No es que se me ocurra una solución mejor, aparte de la respuesta de Bill. –

9

Es un buen diseño de interfaz de usuario para asegurarse de que sus simples clics y hace doble clic son conceptualmente relacionada:

Single-Click: select icon 
Double-Click: select icon and open it 

Single-Click: select color 
Double-Click: select color and open palette editor 

Note como en estos ejemplos, el único clic en la acción es en realidad un subconjunto del doble clic. Esto significa que puede seguir adelante y hacer su acción de un solo clic con normalidad y acaba de hacer la acción adicional si el doble clic viene en

Si su interfaz de usuario hace algo como:.

Single-Click: select icon 
Double-Click: close window 

Entonces usted está configurar a tus usuarios para que fallen. Incluso si recuerdan lo que hace un simple clic frente al doble clic todo el tiempo, es muy fácil mover el mouse accidentalmente demasiado al hacer doble clic o esperar demasiado.

Editar:

lo siento escuchar eso.

En ese caso, He encontrado estos dos artículos útiles:

+2

Ese es un buen punto pero, desafortunadamente, no es mi decisión tomarlo. –

+1

@Bill: No estoy de acuerdo, creo que hay diseños de IU válidos en los que debe distinguir los dos clics. P. ej. : detiene el reproductor de audio, muestra información sobre el elemento seleccionado. : igual que con un solo clic: más reproducir el elemento seleccionado. Si no puede distinguirlos, ambos se disparan, y si se ejecuta un solo clic después de hacer doble clic, el reproductor de audio se detendrá. – e1i45

+1

@ e1i45: ¿Ha visto el evento de doble clic que llega antes del clic simple? Eso suena muy poco probable, ya que el sistema operativo no podrá decir que se trata de una acción de doble clic hasta que se haya entregado un solo clic. – Bill

0

Usando PySide que es el enlace de Python de Qt 4.8 vi que clics individuales entregar un QEvent.MouseButtonPress evento y doble clic entregan un solo evento QEvent.MouseButtonPress seguido de cerca por QEvent.MouseButtonDblClick. La demora es aproximadamente de 100ms en Windows. Eso significa que aún tiene un problema si necesita diferenciar entre clics simples y dobles.

La solución necesita otro QTimer con un retraso ligeramente mayor que el retraso incorporado (agregando un poco de sobrecarga). Si observa un evento QEvent.MouseButtonPress, inicia su propio temporizador, en caso de tiempo de espera es un solo clic. En el caso de un QEvent.MouseButtonDblClick es un doble clic y se detiene el temporizador para evitar contar como un solo clic.

Cuestiones relacionadas