Вопрос

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

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

Это было полезно?

Решение 4

Я уже достал эту проблему. Я использовал qtooltip QT - Как нанести Qtooltip на QlineEdit В качестве способа информировать пользователя о статистике блокировки CAPS и, конечно, использовался функцию, которая получает текущее состояние (getKeyState (VK_CAPITAL)). Недостаток: это работает только в Windows.

Другие советы

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

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

Подождите, пока QT :: KEY_CAPSLOCK Введите в обработчик QKEYEVENT или фильтр событий, когда событие Qevent :: KeyPress?

Поскольку, похоже, нет кроссплатформенного QT-родного способа сделать это, вы можете написать несколько альтернативных способов с помощью платформы с #ifdefS, чтобы выбрать правильную платформу.

В этом случае, Эта статья на форуме 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top