Qt-поле пароля, предупреждает о Caps-Lock

есть ли какой-либо Qt-встроенный метод, чтобы предупредить пользователя (с всплывающим окном), что CapsLock включен, пока поле пароля активно?

в настоящее время я использую QLineEdit (Это хорошо?) с setEchoMode(QLineEdit::Password).

8 ответов


Как только пользователь нажимает клавишу, вы должны проверить, если это верхний регистр и если сдвиг удерживается. если shift не удерживается, а вход в верхнем регистре, caps lock включен. также, если shift вниз, а вход строчный, caps lock тоже включен.


пост от Lefrere Вероника в списке рассылки Qt Interest есть ответ, если вы можете подождать, пока пользователь нажмет клавишу:

подождите Qt::Key_CapsLock введите обработчик qkeyevent или фильтр событий когда событие является QEvent:: KeyPress?


поскольку, похоже, нет кросс-платформенного Qt-родного способа сделать это, вы можете написать несколько зависящих от платформы способов с #ifdefS, Чтобы выбрать правильную платформу.

В этом случае эта статья форума QT имеет ответ:

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

Если вы поместите это в свой собственный исходный файл, чтобы вы не делали никакой другой обработки событий QT в этом файле, тогда вам не нужно делать #undefs.


Я уже soved эту проблему. Я использовал QToolTip QT - как применить QToolTip к QLineEdit как способ информирования пользователь о caps lock stat и использовал, конечно же, функцию, которая получает текущее состояние (GetKeyState (VK_CAPITAL)). Недостаток: это работает только на Windows.


для macs, чтобы определить состояние ключа caps lock, вы можете сделать следующее.

создать .h/.затем включите эти файлы в файл Qt pro следующим образом:

SOURCES += myFile.h

macx: OBJECTIVE_SOURCES += myFile.mm

в myFile.h добавить следующее...

bool IsCapsEnabled_mac();

в myFile.мм добавить следующее (важен порядок включения / импорта)...

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

Если вы пишете для KDE (а не для generic Qt), используйте KModifierKeyInfo:: isKeyLocked ().

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

(предупреждение: я не тестировал этот код)


Это действительно комментарий к ответу Бибера, но у меня недостаточно репутации, чтобы опубликовать их: P. Это просто идея чего-то, что я читаю, я никогда не пробовал :S.

Это о том, как узнать, нажата ли shift, вы видели Qt:: KeyboardModifiers Это можно обнаружить в Qt:: KeyEvent? Есть модификатор, он может быть полезен. Кстати, я также видел, что есть ключ под названием Qt:: Key_CapsLock, который также может быть обнаружен в ключе Событие.

и читая ссылку отчета об ошибке по ссылке в комментарии Нарека вашего вопроса, кажется, что функция просто недоступна, поэтому я думаю, что способ сделать это-сделать что-то похожее на то, что предлагает Бибер. Но чтобы не ждать, пока пользователь нажмет клавишу, возможно, вы можете запустить/имитировать событие клавиатуры, которое помещает букву в QLineEdit. Затем проверьте, что сказал Бибер: если буква в верхнем регистре и Shift нажата, то... так далее. И, наконец, удалить содержание QLineEdit. Надеюсь, это произойдет достаточно быстро, чтобы избежать того, что пользователь замечает это: P.

Это несколько уродливая работа, но она может работать. Дайте мне знать, если это произойдет!


основываясь на ответе Кена Блума, я сделал пример проекта Qt, демонстрирующий ключевые шаблоны UX, связанные с этим. В частности, переопределение QDialog:: event() для захвата Caps Lock каждый раз было критическим.

https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check