2010-06-03 24 views
13

¿Hay algún método incorporado en Qt para advertir al usuario (con ventana emergente) que CapsLock está activado mientras el campo de contraseña está activo?Qt - Campo de contraseña, advierte acerca de Caps-Lock

Actualmente estoy usando QLineEdit (¿es bueno?) Con setEchoMode(QLineEdit::Password).

+0

No hay manera de comprobar el estado CapsLock con Qt (hay cuestiones abiertas con respecto a este en el Bug Tracker Qt (http://bugreports.qt.nokia.com/browse/QTBUG-8388) ¿Es su aplicación multiplataforma? –

Respuesta

1

He soved este problema ya. He usado QToolTip QT - How to apply a QToolTip on a QLineEdit como una forma de informar al usuario acerca de mayúsculas y minúsculas stat, y usé, por supuesto, una función que obtiene el estado actual (GetKeyState (VK_CAPITAL)). Desventaja: esto solo funciona en Windows.

2

A post from Veronique Lefrere en la lista de correo de QT interés tiene una respuesta, si se puede esperar a que el usuario pulse una tecla:

espera para Qt :: tipo Key_CapsLock en un controlador o un evento filtro qkeyevent cuando evento es QEvent :: KeyPress?

+0

No debería esperar a ese evento, el usuario podría haber presionado CapsLock antes de invocar mi aplicación. Al menos debería saber el estado actual de ese botón! – Narek

+0

Anulación de QDialog :: event() permite capturar cada mayúsculas y minúsculas bloqueadas, combinadas con otras respuestas aquí para obtener el estado de bloqueo de mayúsculas real. Consulte, por ejemplo: https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check – savolai

3

una vez que el usuario presiona una tecla, debe verificar si está en mayúscula Y si se está manteniendo el cambio. si no se mantiene el cambio, y la entrada está en mayúscula, el bloqueo de mayúsculas está activado. también si el cambio está desactivado, y la entrada es en minúscula, el bloqueo de mayúsculas está activado también.

+0

¿Qué pasa si el usuario nunca presiona CapsLock durante el tim e mi aplicación funciona :)? – Narek

+0

Esto no funciona en un Macintosh, porque AIUI la tecla de bloqueo de mayúsculas solo hace que todo esté en mayúscula, incluso cuando se presiona Shift. (Aunque admito que este conocimiento se remonta al Sistema 7, por lo que podría haber cambiado en MacOS X.) –

+0

, así debería funcionar, si lo compruebas con cada pulsación de tecla. eso es solo una idea básica que eché :) – Biber

0

Esto es realmente un comentario a la respuesta de Biber, pero no tengo suficientes representantes para publicarlos: P. Es solo una idea de algo que leo, nunca lo intenté: S.

Se trata de la forma de saber si se presiona shift, ¿ha visto el Qt::KeyboardModifiers que se puede detectar en un Qt::KeyEvent? Hay un modificador de turno, podría ser útil. Por cierto, también vi que hay una clave llamada Qt :: Key_CapsLock que también se puede detectar en un evento clave.

Y leyendo el enlace del informe de errores en el enlace del comentario de Narek sobre su pregunta, parece que la función simplemente no está disponible, así que creo que la manera de hacerlo es hacer algo similar a lo que Biber sugiere. Pero para evitar esperar a que el usuario presione una tecla, quizás pueda disparar/simular un evento de teclado que coloca una letra en su QLineEdit. Luego, compruebe lo que dijo Biber: si la letra es mayúscula y se pulsa shift, entonces ... etc. Y finalmente elimine el contenido de QLineEdit. Esperemos que suceda lo suficientemente rápido como para evitar que el usuario lo note: P.

Es un trabajo un poco feo, pero podría funcionar. ¡Avíseme si lo hace!

2

Dado que no parece haber una forma nativa de QT multiplataforma para hacer esto, es posible que desee escribir varias formas dependientes de la plataforma con #ifdef s para seleccionar la plataforma correcta.

En ese caso, this QT forum article has the answer:

#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 
} 

Si pones esto en su propio archivo de origen, por lo que no se hace ningún otro procesamiento de eventos QT en ese archivo, entonces no es necesario hacer el #undef s.

+0

Gracias, funciona. Nada imposible, ¿no? :) – Narek

+0

@Narek, dijiste que estabas buscando algo independiente de la plataforma. –

+0

Esto debería funcionar en WINDOWS yy ... en Linux, MacOS (¡en Windows funciona!). – Narek

0

Si está escribiendo para KDE (y no Qt genérico), utilice KModifierKeyInfo::isKeyLocked().

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

(advertencia: no he probado este ejemplo de código)

+0

Lo que la frase "Si está escribiendo para KDE (y no Qt genérico)" significa. Por favor en detalle. – Narek

+0

http://en.wikipedia.org/wiki/KDE Es un entorno de escritorio Linux, que AIUI también puede ejecutar en Windows o MacOS. –

+0

No entiendo cómo usar ... ¿Podría escribir un fragmento de código? – Narek

1

Para Mac, para detectar el estado de la tecla de bloqueo de mayúsculas, puede hacer lo siguiente.

Crear un par .h/.mm continuación, estos archivos se incluyen en el archivo de pro Qt de la siguiente manera:

SOURCES += myFile.h 

macx: OBJECTIVE_SOURCES += myFile.mm 

en MYFILE.H añadir lo siguiente ...

bool IsCapsEnabled_mac();

en myFile.mm agregue lo siguiente (el orden de los includes/imports es 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); 
} 
Cuestiones relacionadas