Qt - Пароль, предупреждайте о Caps-Lock

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

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

Ответы

Ответ 1

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

Ответ 2

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

Ответ 3

Сообщение от Veronique Lefrere в списке рассылки QT Interest имеет ответ, если вы можете подождать, пока пользователь нажмет клавишу:

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

Ответ 4

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

В этом случае в этой статье форума 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, вам не нужно делать #undef s.

Ответ 5

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

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

SOURCES += myFile.h

macx: OBJECTIVE_SOURCES += myFile.mm

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

bool IsCapsEnabled_mac();

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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