QT - Поле пароля, предупреждайте о замке Caps -Lock
Вопрос
Существует ли какой-нибудь метод, подготовленный QT, чтобы предупредить пользователя (с всплывающим окном) о том, что Capslock включен, в то время как поле пароля активно?
Я сейчас использую QLineEdit
(Это хорошо?) С setEchoMode(QLineEdit::Password)
.
Решение 4
Я уже достал эту проблему. Я использовал qtooltip QT - Как нанести Qtooltip на QlineEdit В качестве способа информировать пользователя о статистике блокировки CAPS и, конечно, использовался функцию, которая получает текущее состояние (getKeyState (VK_CAPITAL)). Недостаток: это работает только в Windows.
Другие советы
Как только пользователь нажимает клавишу, вы должны проверить, является ли его верхний чехол и содержится ли сдвиг. Если сдвиг не удерживается, а вход - верхний регистр, блокировка крышек включена. Кроме того, если сдвиг не вниз, а вход является нижним регистом, блокировка крышек тоже включена.
Пост от Вероник -Лефрера В списке рассылки QT интереса есть ответ, если вы можете ждать, пока пользователь нажмет клавишу:
Подождите, пока 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
с
Для Mac, чтобы обнаружить состояние ключа блокировки Caps, вы можете сделать следующее.
Создайте файлов.
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 );
}
Если вы пишете для KDE (а не общего QT), то используйте KmodifierKeyInfo :: iskyclocked ().
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(Предупреждение: я не проверил этот пример кода)
Это действительно комментарий к ответу бибера, но у меня недостаточно представителей, чтобы опубликовать их: с. Это просто идея того, что я прочитал, я никогда не пробовал: s.
Это о том, как узнать, нажали ли сдвиг, вы видели QT :: Клавианые модификаторы что можно обнаружить в QT :: KeyEvent? Есть модификатор смены, это может быть полезно. Кстати, я также видел, что есть ключ под названием QT :: Key_capslock, который также может быть обнаружен в ключевом событии.
И чтение ссылки отчета об ошибке по ссылке в комментарии Нарека о вашем вопросе, кажется, что эта функция просто недоступна, поэтому я думаю, что способ сделать это сделать что -то похожее на то, что предлагает Biber. Но чтобы не ждать, пока пользователь нажмет клавишу, возможно, вы можете запустить/имитировать событие клавиатуры, которое помещает букву в QlineEdit. Затем проверьте, что сказал Бибр: Если буква является верхним регистом, а затем нажимается ... и т. Д. И, наконец, удалите содержимое QlineEdit. Надеемся, что это произойдет достаточно быстро, чтобы избежать того, что пользователь замечает это: с.
Это несколько уродливая работа, но это может работать. Дайте мне знать, если это так!
Основываясь на ответе Кена Блума, я сделал пример проекта QT, демонстрирующий ключевые шаблоны UX, связанные с этим. Особенно переопределение qdialog :: event (), чтобы ловить крышки каждый раз, было критическим.
https://github.com/savolai/qt-widgets-password-dialog-with-caps-lock-check