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-родного способа сделать это, вы можете написать несколько зависящих от платформы способов с #ifdef
S, Чтобы выбрать правильную платформу.
В этом случае эта статья форума 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.
Я уже 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