Там какой-либо метод Qt-built-in должен предупредить пользователя (со всплывающим окном), что CapsLock включается, в то время как поле пароля активно?
Я в настоящее время использую QLineEdit
(действительно ли это хорошо?) с setEchoMode(QLineEdit::Password)
.
Я уже решил эту проблему. Я использовал QToolTip QT - Как применить QToolTip к QLineEdit как способ информирования пользователь о статистике Caps Lock и, конечно же, использовал функцию, которая получает текущее состояние (GetKeyState (VK_CAPITAL)). Недостаток: работает только в Windows.
Сообщение от Вероник Лефрер в списке рассылки QT Interest содержит ответ, если вы можете дождаться, пока пользователь нажмет клавишу:
дождитесь типа Qt :: Key_CapsLock в qkeyevent обработчик или фильтр событий когда событие QEvent :: KeyPress?
после того, как пользователь нажимает клавишу, вы должны проверить, если это верхний регистр И если сдвиг удерживается. если shift не удерживается и вводится прописными буквами, включена фиксация заглавных букв. также, если сдвиг вниз, а ввод - строчные, блокировка заглавных букв тоже включена.
Поскольку, похоже, не существует кроссплатформенного 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.
Если вы пишете для KDE (а не для Qt), используйте KModifierKeyInfo :: isKeyLocked () .
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(предупреждение: я не тестировал этот образец кода)
Это действительно комментарий к ответу Biber, но у меня недостаточно репутации, чтобы опубликовать его: P. Это просто идея того, что я прочитал, никогда не пробовал: S.
Это способ узнать, нажата ли клавиша shift. Вы видели Qt :: KeyboardModifiers , которые можно обнаружить в Qt :: KeyEvent ? Есть модификатор сдвига, может пригодиться. Кстати, я также видел, что есть ключ под названием Qt :: Key_CapsLock, который также может быть обнаружен в ключевом событии.
И читая ссылку на отчет об ошибке по ссылке в комментарии Нарека к вашему вопросу, кажется, что эта функция просто недоступна, поэтому я думаю, что способ сделать это - сделать что-то похожее на то, что Biber предложить. Но чтобы не ждать, пока пользователь нажмет клавишу, возможно, вы можете запустить / имитировать событие Keyboard, которое помещает букву в ваш QLineEdit. Затем проверьте, что сказал Бибер: если буква в верхнем регистре и нажата клавиша shift, то ... и т. Д. И, наконец, удалите содержимое QLineEdit. Надеюсь, это произойдет достаточно быстро, чтобы пользователь не заметил этого: P.
Это несколько уродливый обходной маневр, но он может сработать. Сообщите мне, если это произойдет!