2016-07-25 15 views
1

Ich schreibe ein Accessibility-Tool mit Qt, mit dem der Benutzer die Maus nur mit der Tastatur bedienen kann. Menschen, die nur Mäuse wirklich hassen, können es auch benutzen.Wie kann ich feststellen, was Qt.KeyEvent Shift + 0 ergibt?

enter image description here enter image description here

Die besonderen Herausforderungen dieser Anwendung sind Strecken, was mit Qt möglich ist, aber zum Glück ist Qt elastisch.

Der Benutzer drückt Caps Lock um das Werkzeug zu aktivieren, woraufhin das Werkzeug Steals konzentrieren. Ein Raster erscheint auf dem Bildschirm und der Benutzer drückt die Tasten, die die Maus jedes Mal kleiner bewegen.

Drücken Sie 0 linke Mausklicks und das Raster verschwindet. Hinzufügen von doppelten Doppelklicks.

Mit Umschalt 0 sollte Mausklick rechts und Drücken von Strg Umschalt 0 sollte Mitte klicken.

Das Problem, das ich bin vor ist, dass, während auf meiner Tastatur, Shift+0 in einem QKeyEvent(QKeyEvent.KeyPress, Qt.NoModifier, Qt.Key_ParenRight) führen (so ein )), ist dies nicht überhaupt gewährleistet. Wenn mein Computer im japanischen IME ist, erhalte ich eine QKeyEvent(QKeyEvent.KeyPress, Qt.ShiftModifier, Qt.Key_0).

japanese kb layout

Hilfe, wie kann ich Informationen bekomme ich brauchen, um über die aktuelle Tastaturlayout des Benutzers, so kann ich die richtige Qt.KeyEvent wählen zu hören?

Antwort

0

Sie können nicht. Selbst wenn Sie alle möglichen Layouts und das aktuelle Layout kennen würden, wie würden Sie den Unterschied zwischen dem Benutzer, der shift+<key> drückt, oder dem Benutzer, der die Feststelltaste aktiviert hat, und der Taste <key> drücken.

Das hier Problem ist, dass Sie shift als Modifikator verwenden, die nicht ist. So entweder Sie gehen auf diese Weise ein Angebot Benutzer eine Möglichkeit, ihre Einstellungen zu ändern, oder Fallback auf die Verwendung eines Standard-Modifier-Schlüssel.

Update: Siehe Kommentare

+0

Microsoft Windows haben bereits Tastaturtasten für die Steuerung der Maus definiert. https://support.microsoft.com/en-us/help/14204/windows-7-use-mouse-keys-to-move-mouse-pointer –

+0

Downvoted weil: 1. Qt löst bereits die "caps Lock "Problem durch Senden von verschiedenen Tastencodes, wie ich oben gezeigt habe. 2. Shift ist ein Modifikator nach Qt. Siehe Qt.ShiftModifier. 3. Wenn Sie alle möglichen Layouts und das aktuelle Layout (und seine Informationen) kannten, können Sie "0" finden, die Umschalttaste von 0 finden und mit diesem QKey nach QKeyEvents suchen. 4. MouseKeys hat damit nichts zu tun. –

+0

1. Wie können Sie den Unterschied zwischen Drücken von '(' und Drücken von 'shift + 0' machen, da der spätere Wert als' ('.') Interpretiert wird. 2. Sie erhalten einen 'shift'-Modifizierer auf Japanisch, weil Sie kein anderes Zeichen haben mit 'shift + 0', in anderen Layouts als dem auf Ihrem Computer erhalten Sie keinen Modifikator, weil' shift + 0' in '('. –

0

Auch wenn Sie das aktuelle Layout wissen konnte, gibt es keine Garantie dafür, dass eine bestimmte Tastenkombination zwischen verschiedenen Layouts übersetzbar ist. Einige Tasten sind möglicherweise überhaupt nicht verfügbar, und einige Tastenkombinationen sind einfach unmöglich (wegen der widersprüchlichen Verwendung der Umschalttaste).

Die einzige praktikable allgemeine Lösung besteht darin, Tastaturkurzbefehle als übersetzbare Zeichenfolgen zu behandeln. Dies bedeutet, dass Sie sich für einen Standardsatz von Verknüpfungen für Ihre Anwendung entscheiden müssen und dann providing translatations davon basierend auf dem am häufigsten verwendeten Tastaturlayout für jedes Gebietsschema, das Sie unterstützen möchten.

Mit dieser können Sie dann zur Laufzeit eine Zuordnung lokalisierter Verknüpfungszeichenfolgen zu Funktionen erstellen - so können Sie Schlüsselereignisse unabhängig von den tatsächlichen Tastenkombinationen interpretieren, die im aktuellen Gebietsschema zugewiesen wurden.

Und beachten Sie, dass ein System wie dies auch machen würde es einfach, Benutzerkonfiguration von Tastenkombinationen zu unterstützen (da der allgemeine Mechanismus ist fast das gleiche).

PS:

Wie bereits in den Kommentaren, sollten Sie vermeiden QKeyEvent.modiifiers() verwenden, wie es unzuverlässig ist. Verwenden Sie stattdessen QGuiApplication.keyboardModifiers().

+0

In diesem Fall sind übersetzbare Zeichenfolgen eine schlechte Lösung, da Sie den Benutzern basierend auf ihrem Gebietsschema ein Tastaturlayout erzwingen. Ja, es wird die meiste Zeit funktionieren, aber nicht die ganze Zeit. Bessere Ergebnisse können erzielt werden, wenn 'QInputMethod :: locale()' anstelle der UI 'QLocale' verwendet wird. Es wird nur dann eine richtige Lösung, wenn der Benutzer seine Tastaturkurzbefehle konfigurieren kann (letzter Absatz). Hinweis: Die Verwendung von übersetzbaren Zeichenfolgen für Tastaturkürzel ist eine gute Idee, wenn die Tastenkombination nur von der Sprache der Benutzeroberfläche abhängt. (zB Shortcuts für Aktionen in einer Anwendungsmenüleiste) –

+0

@BenjaminT. Jede Lösung muss angesichts der Art des Problems ein Kompromiss sein. Nichts wird "durchgesetzt". Der Zweck der Verwendung von Übersetzungen besteht darin, für alle Benutzer einen besseren Satz von ** Standardwerten ** bereitzustellen. Dies sollte in 95% der Fälle zu einer guten Out-of-the-Box-Lösung führen. Der Rest kann erledigt werden, indem die Verknüpfungen vom Benutzer konfigurierbar gemacht werden. – ekhumoro