Frage

Gibt es eine von QT gebaute Methode, um Benutzer (mit Pop-up-Fenster) zu warnen, dass Capslock eingeschaltet ist, während das Kennwortfeld aktiv ist?

Ich benutze gerade QLineEdit (Ist es gut?) Mit setEchoMode(QLineEdit::Password).

War es hilfreich?

Lösung 4

Ich habe dieses Problem schon so gesichert. Ich habe Qtooltip verwendet QT - So wenden Sie einen Qtooltip auf einen QlineEdit an Um den Benutzer über CAPS -Lock -Status zu informieren, und natürlich eine Funktion verwendet, die den aktuellen Status erhält (getKeystate (vk_capital)). Nachteil: Dies funktioniert nur unter Windows.

Andere Tipps

Sobald der Benutzer auf eine Taste gedrückt wird, sollten Sie prüfen, ob es sich um den oberen Fall handelt und ob die Verschiebung gehalten wird. Wenn die Verschiebung nicht gehalten wird und der Eingang Großbuchstaben ist, ist das Caps -Schloss eingeschaltet. Auch wenn die Verschiebung sinkt und der Eingang in Kleinbuchstaben ist, ist auch die Caps -Sperre eingeschaltet.

Ein Beitrag von Veronique LeFrere In der QT Interest Mailingliste enthält eine Antwort, wenn Sie darauf warten können, dass der Benutzer eine Taste drückt:

Warten Sie auf qt :: Key_Capslock -Typ in einem QKeyEvent -Handler oder Ereignisfilter, wenn Ereignis QEVENT :: Schlüsselpress ist?

Da es keine plattformübergreifende qt-native Möglichkeit zu geben scheint, möchten Sie möglicherweise mehrere plattformabhängige Wege schreiben #ifdefs, um die richtige Plattform auszuwählen.

In diesem Fall, Dieser QT -Forum -Artikel hat die Antwort:

#ifdef Q_OS_WIN32
# include <windows.h>
#else
#  include <X11/XKBlib.h>
# undef KeyPress
# undef KeyRelease
# undef FocusIn
# undef FocusOut
// #undef those Xlib #defines that conflict with QEvent::Type enum
#endif
bool QMyClass::checkCapsLock()
{
 // platform dependent method of determining if CAPS LOCK is on
#ifdef Q_OS_WIN32 // MS Windows version
 return GetKeyState(VK_CAPITAL) == 1;
#else // X11 version (Linux/Unix/Mac OS X/etc...)
 Display * d = XOpenDisplay((char*)0);
 bool caps_state = false;
 if (d)
 {
  unsigned n;
  XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
  caps_state = (n & 0x01) == 1;
 }
 return caps_state;
#endif
}

Wenn Sie dies in eine eigene Quelldatei einfügen, damit Sie in dieser Datei keine andere QT -Ereignisverarbeitung durchführen, müssen Sie die nicht ausführen #undefs.

Für MACs können Sie zum Erkennen des Zustands des Caps -Sperrenschlüssels Folgendes tun.

Erstellen Sie ein .h / .mm -Dateipaar und geben Sie diese Dateien wie folgt in Ihre QT Pro -Datei ein:

SOURCES += myFile.h

macx: OBJECTIVE_SOURCES += myFile.mm

in myfile.h fügen Sie die folgenden ... hinzu ...

bool IsCapsEnabled_mac();

In myFile.mm fügen Sie Folgendes hinzu (die Reihenfolge der Einschlüsse / Importe ist wichtig) ...

#include <QtCore>
#include <QtGui>
#include <QtMac>
#include "myFile.h"

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#include <CoreFoundation/CoreFoundation.h>
#include <ApplicationServices/ApplicationServices.h>

bool IsCapsEnabled_mac()
{
    NSUInteger flags = [NSEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;
    return ( flags & NSAlphaShiftKeyMask );
}

Wenn Sie für KDE (und nicht generisches QT) schreiben, verwenden Sie dann KmodifierKeyInfo :: iskeylocked ().

KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)

(Warnung: Ich habe dieses Code -Beispiel nicht getestet)

Dies ist wirklich ein Kommentar zur Biber -Antwort, aber ich habe nicht genug Repräsentanten, um diese zu posten: p. Es ist nur eine Idee von etwas, das ich gelesen habe, ich habe es nie versucht: s.

Es geht um den Weg zu wissen, ob die Verschiebung gedrückt wird, haben Sie das gesehen Qt :: KeyboarModifiers das kann in a erkannt werden Qt :: KeyEvent? Es gibt einen Schichtmodifikator, er könnte nützlich sein. Übrigens habe ich auch gesehen, dass es einen Schlüssel namens Qt :: Key_CapsSlock gibt, der auch in einem Schlüsselereignis erkannt werden kann.

Und das Lesen des Links des Fehlerberichts im Link im Kommentar von Narek Ihrer Frage scheint, dass die Funktion einfach nicht verfügbar ist. Ich denke also, dass der Weg, dies zu tun, darin besteht, etwas Ähnliches zu tun, was Biber vorschlägt. Um jedoch zu vermeiden, dass der Benutzer eine Taste drückt, können Sie möglicherweise ein Tastaturereignis abfeuern/simulieren, das einen Brief in Ihr QlineEdit einbringt. Überprüfen Sie dann, was Biber gesagt hat: Wenn der Buchstabe oberes Gehäuse ist und die Verschiebung gedrückt wird ... usw. und schließlich den Inhalt des QlineEdit löschen. Hoffentlich wird es schnell genug passieren, um zu vermeiden, dass der Benutzer es bemerkt: p.

Es ist eine etwas hässliche Arbeit, aber es könnte funktionieren. Lassen Sie mich wissen, ob es so ist!

Basierend auf der Antwort von Ken Bloom habe ich ein QT -Projektbeispiel erstellt, das die wichtigsten UX -Muster im Zusammenhang mit diesem Zeugnis zeigt. Besonders übergeordnetes Qdialog :: Event (), um jedes Mal die Caps -Sperre zu fangen, war kritisch.

https://github.com/savolai/qt-widgets-password-dialog-with-caps-lock-check

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top