Pregunta

¿Hay algún método de QT construido para advertir al usuario (con ventana emergente) de que Capslock se enciende mientras el campo de contraseña está activo?

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

¿Fue útil?

Solución 4

Ya he modificado este problema. He usado qtooltip QT - Cómo aplicar un QTooltip en un QlineEdit Como una forma de informar al usuario sobre las estadísticas de bloqueo de CAPS y, por supuesto, una función que obtiene el estado actual (GetKeyState (VK_Capital)). Desventaja: esto funciona solo en Windows.

Otros consejos

Una vez que el usuario presiona una tecla, debe verificar si es la caja superior y si se retiene el cambio. Si no se mantiene el cambio y la entrada es superior, el bloqueo de CAPS está encendido. Además, si el cambio está hacia abajo y la entrada es en minúsculas, el bloqueo de las tapas también está encendido.

Una publicación de Veronique Lfrere En la lista de correo de QT Interest tiene una respuesta, si puede esperar a que el usuario presione una tecla:

Espere Qt :: Key_CapsLock Tipo en un controlador QKeyEvent o un filtro de evento cuando el evento es Qevent :: KeyPress?

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

En ese caso, Este artículo del foro QT tiene la respuesta:

#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 pone esto en su propio archivo fuente, para que no realice ningún otro procesamiento de eventos de QT en ese archivo, entonces no necesita hacer el #undefs.

Para Macs, para detectar el estado de la tecla de bloqueo CAPS, puede hacer lo siguiente.

Cree un par de archivos .h / .mm y luego incluya estos archivos en su archivo QT Pro de la siguiente manera:

SOURCES += myFile.h

macx: OBJECTIVE_SOURCES += myFile.mm

en myFile.H Agrega lo siguiente ...

bool IsCapsEnabled_mac();

en myFile.mm Agregue lo siguiente (el orden de las incluido / importaciones 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 );
}

Si está escribiendo para KDE (y no QT genérico), use Kmodifierkeyinfo :: iskeylocked ().

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

(Advertencia: no he probado esta muestra de código)

Este es realmente un comentario a la respuesta biber, pero no tengo suficiente representante para publicarlos: p. Es solo una idea de algo que leí, nunca lo he probado: s.

Se trata de la forma de saber si se presiona el cambio, ¿ha visto el Qt :: KeyboardModifiers que se puede detectar en un Qt :: KeyEvent? Hay un modificador de cambio, 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 al leer el enlace del informe de errores en el enlace en el comentario de Narek de su pregunta, parece que la característica simplemente no está disponible, por lo que creo que la forma de hacerlo es hacer algo similar a lo que sugiere Biber. Pero para evitar esperar a que el usuario presione una tecla, tal vez pueda disparar/simular un evento de teclado que ponga una carta en su QlineEdit. Luego, verifique lo que dijo Biber: si la letra es la caja superior y el cambio se presiona entonces ... etc. y finalmente elimine el contenido del QlineEdit. Esperemos que suceda lo suficientemente rápido como para evitar que el usuario lo note: p.

Es un trabajo algo feo, pero podría funcionar. ¡Avísame si es así!

Según la respuesta de Ken Bloom, hice un ejemplo de proyecto QT que demostró los patrones clave de UX relacionados con esto. Particularmente anular QDialog :: Event () para atrapar el bloqueo de los límites cada vez fue crítico.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top