Qt - campo Password, mettere in guardia circa Caps-Lock
Domanda
C'è qualche Qt-built-in metodo per avvertire utente (con finestra pop-up), che CapsLock è acceso, mentre campo password è attiva?
Attualmente sto usando QLineEdit
(è buono?) Con setEchoMode(QLineEdit::Password)
.
Soluzione 4
Ho soved questo problema già. Ho usato QToolTip QT - Come applicare un QToolTip su un QLineEdit come un modo per informare utente circa caps lock stat, e utilizzato, naturalmente, una funzione che riceve stato attuale (GetKeyState (VK_CAPITAL)). Svantaggio: questo funziona solo su di Windows.
Altri suggerimenti
Una volta che l'utente preme un tasto, si dovrebbe verificare se l'è maiuscolo e se si sta svolgendo il turno. se spostamento non è tenuta, e l'ingresso è maiuscola, blocco maiuscole è attivato. anche se spostamento è verso il basso, e l'ingresso è minuscolo, blocco maiuscole è attivato troppo.
Un post da Veronique Lefrere sulla QT interesse mailing list ha una risposta, se si può attendere che l'utente prema un tasto:
attesa per tipo di Qt :: Key_CapsLock in un handler qkeyevent o filtro eventi quando l'evento è QEvent :: KeyPress?
Dato che non sembra essere un modo cross-platform QT-native per fare questo, si potrebbe desiderare di scrivere diversi modi dipendenti dalla piattaforma con #ifdef
s per selezionare la giusta piattaforma.
In questo caso, questo articolo QT forum ha la risposta :
#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
}
Se mettete questo nel proprio file sorgente, in modo che non si fa qualsiasi altra elaborazione evento QT in quel file, allora non c'è bisogno di fare le #undef
s.
per i Mac, per rilevare lo stato del tasto Caps Lock è possibile effettuare le seguenti operazioni.
Crea una .h / .mm coppia di file quindi includere questi file nel file pro Qt come segue:
SOURCES += myFile.h
macx: OBJECTIVE_SOURCES += myFile.mm
nel MYFILE.H aggiungere quanto segue ...
bool IsCapsEnabled_mac();
nel myFile.mm aggiungere il seguente (l'ordine del includes / importazioni è importante) ...
#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 );
}
Se si sta scrivendo per KDE (e non generiche Qt), quindi utilizzare KModifierKeyInfo :: isKeyLocked () .
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(attenzione: non ho ancora testato questo esempio di codice)
Questo è davvero un commento alla risposta Biber, ma non ho abbastanza rep di inviare quelli: P. E 'solo un'idea di qualcosa che ho letto, non ho mai provato. S
Si tratta del modo per sapere se viene premuto shift, hai visto il Qt :: KeyboardModifiers che può essere rilevato in un Qt :: KeyEvent ? C'è un modificatore di cambiamento, potrebbe essere utile. Btw Ho anche visto che c'è una chiave denominata Qt :: Key_CapsLock che può essere rilevato anche in un evento chiave.
E leggendo il link del bug report al link nel commento di Narek della tua domanda, sembra che la funzione non è solo a disposizione, quindi penso che il modo per farlo è quello di fare qualcosa di simile a ciò che Biber suggerire. Ma per evitare di attendere che l'utente prema un tasto forse si può sparare / simulare un evento di tastiera che mette una lettera nella tua QLineEdit. Allora verificare la presenza di quello che ha detto Biber: Se la lettera è maiuscola e lo spostamento viene premuto poi ... ecc E, infine, eliminare il contenuto della QLineEdit. Speriamo che accadrà abbastanza velocemente per evitare che l'utente ne accorge:. P
E 'un giro di lavoro un po' brutto, ma potrebbe opere. Fatemi sapere se lo fa!
In base alla risposta di Ken Bloom, ho fatto un esempio di progetto Qt dimostrando i modelli UX chiave relativi a questo. Particolarmente override QDialog :: evento () per Caps fermo della serratura ogni volta è stato critico.
https://github.com/savolai / Qt-Widget-Password-dialogo-con-caps-lock-check