2011-01-07 5 views
11

Ich habe ein QAbstractItemView, die Einzel- und Doppelklick auf Ereignisse reagieren muss. Die Aktionen unterscheiden sich je nachdem, ob auf einen einzelnen Klick oder einen Doppelklick geklickt wurde. Das Problem, das auftritt, ist, dass das Einzelklickereignis vor dem Doppelklickereignis empfangen wird.zwischen Einzel- und Doppelklickereignissen in Qt

Gibt es eine empfohlene Weg/bewährten Verfahren zwischen den beiden zu unterscheiden? Ich möchte die Einzelklick-Aktion nicht ausführen, wenn der Benutzer tatsächlich doppelt geklickt hat.

Ich bin mit Qt 4.6

Antwort

6

Sie Antwort im Thread Double Click Capturing auf QtCentre Forum Titel finden können;

Sie können einen Timer haben. Starten Sie die Timer im releaseEvent Handler und sicherstellen, dass die Timeout lang genug zuerst den Doppelklick zu behandeln. Dann, in dem Doppelklick-Ereignis Handler können Sie den Timer stoppen und verhindern, dass es abfeuert. Wenn ein Doppel Click-Handler nicht ausgelöst wird, wird der Timer Timeout und einen Schlitz von Ihrer Wahl nennen, wo Sie den einzigen Klick verarbeiten können. Dies ist natürlich ein hässlicher Hack, hat aber eine Chance zu arbeiten.

wysota

+0

Es funktioniert, aber es erzeugt natürlich eine Verzögerung in der Benutzererfahrung, wenn Sie einfach klicken. Was auch immer mit einem einzigen Klick geschehen sollte, scheint eine "lange" Zeit zu benötigen (QApplication :: doubleClickInterval()), daher scheint die Anwendung langsam zu sein. Nicht dass ich mir eine bessere Lösung vorstellen kann, abgesehen von Bills Antwort. –

9

Es ist ein gutes UI-Design, um sicherzustellen, Ihre Single-Klicks und Doppelklicks konzeptionell verwandt sind:

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

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

Beachten Sie, wie in diesen Beispielen werden die Aktion mit einem Klick ist eigentlich eine Teilmenge des Doppelklicks. Dies bedeutet, können Sie voran gehen und tun Sie Ihre Ein-Klick-Aktion normal und tun nur die zusätzliche Aktion, wenn der Doppelklick kommt

Wenn Ihre Benutzeroberfläche tut so etwas wie:.

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

Dann sind Sie Setzen Sie Ihre Benutzer zum Scheitern. Selbst wenn sie sich daran erinnern, was ein einzelner Klick im Vergleich zu einem Doppelklick tut, ist es sehr einfach, die Maus versehentlich zu weit zu bewegen, während Sie doppelklicken oder zu lange warten.

Edit:

Es tut mir leid, das zu hören.

In diesem Fall fand ich diese beiden Artikel nützlich:

+2

Das ist ein guter Punkt, aber leider nicht meine Entscheidung zu treffen. –

+1

@Bill: Ich stimme nicht zu, ich glaube, es gibt gültige UI-Designs, wo Sie die zwei Klicks unterscheiden müssen. z. : Stoppen Sie den Audio-Player, zeigen Sie Informationen zum ausgewählten Element an. : Wie single-click: plus spielt das ausgewählte Element ab. Wenn Sie sie nicht unterscheiden können, werden beide ausgelöst, und wenn der Einzelklick nach dem Doppelklick ausgeführt wird, wird der Audio-Player gestoppt. – e1i45

+1

@ e1i45: Haben Sie gesehen, dass das Doppelklickereignis vor dem Einzelklick eintrifft? Das klingt sehr unwahrscheinlich, da das Betriebssystem erst nach dem Senden des einzelnen Klicks erkennen kann, dass es sich um einen Doppelklick handelt. – Bill

0

pyside mit dem die Python Bindung von Qt 4.8 ich, dass einzelne Klicks liefern gesehen ist eine QEvent.MouseButtonPress Ereignis- und Doppelklicks liefern ein einzelnes Ereignis QEvent.MouseButtonPress dicht gefolgt von einem QEvent.MouseButtonDblClick. Die Verzögerung beträgt ungefähr unter Windows. Das bedeutet, dass Sie immer noch ein Problem haben, wenn Sie zwischen einfachen und doppelten Klicks unterscheiden müssen.

Die Lösung benötigt eine weitere QTimer mit einer etwas höheren Verzögerung als die eingebaute Verzögerung (Hinzufügen von etwas Overhead). Wenn Sie ein QEvent.MouseButtonPress Ereignis beobachten, starten Sie Ihren eigenen Timer, im Falle eines Timeouts ist es ein einzelner Klick. Im Fall eines QEvent.MouseButtonDblClick ist es ein Doppelklick und Sie stoppen den Timer, um das Zählen als Einzelklick zu vermeiden.

Verwandte Themen