Qt - поле пароля, предупредить о Caps-Lock - PullRequest
13 голосов
/ 03 июня 2010

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

Я сейчас использую QLineEdit (это хорошо?) С setEchoMode(QLineEdit::Password).

Ответы [ 8 ]

3 голосов
/ 03 июня 2010

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

2 голосов
/ 09 июня 2010

Поскольку не существует кроссплатформенного 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.

2 голосов
/ 03 июня 2010

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

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

1 голос
/ 16 октября 2014

Для Mac, чтобы определить состояние клавиши блокировки крышки, вы можете сделать следующее.

Создайте пару файлов .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 );
}
1 голос
/ 11 июня 2010

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

0 голосов
/ 20 мая 2017

Основываясь на ответе Кена Блума, я сделал пример проекта Qt, демонстрирующий ключевые шаблоны UX, связанные с этим. Особенно важно переопределить QDialog :: event (), чтобы каждый раз перехватывать Caps Lock.

https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check

0 голосов
/ 10 июня 2010

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

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

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

0 голосов
/ 09 июня 2010

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

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

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

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

...