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).

È stato utile?

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 #ifdefs 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 #undefs.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top