QT - поле Password, предупредите о Caps Lock

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

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

14
задан Max Leske 20 September 2015 в 17:10
поделиться

6 ответов

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

1
ответ дан 1 December 2019 в 15:11
поделиться

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

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

2
ответ дан 1 December 2019 в 15:11
поделиться

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

3
ответ дан 1 December 2019 в 15:11
поделиться

Поскольку, похоже, не существует кроссплатформенного 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 в этом файле, то вам не нужно делать #undefs.

2
ответ дан 1 December 2019 в 15:11
поделиться

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

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

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

0
ответ дан 1 December 2019 в 15:11
поделиться

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

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

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

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

0
ответ дан 1 December 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: