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