2010-06-03 5 views
13

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

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

+0

Там нет никакого способа проверить состояние CapsLock с Qt (есть открытые вопросы, касающиеся этого в Bug Tracker Qt (http://bugreports.qt.nokia.com/browse/QTBUG-8388) Является ли ваше приложение кросс-платформенным? –

ответ

1

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

2

A post from Veronique Lefrere на списке рассылки QT Interest есть ответ, если вы можете ждать, пока пользователь не нажмет клавишу:

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

+0

Я не должен дождаться этого события, пользователь мог бы использовать CapsLock ранее для вызова моего приложения. По крайней мере, я должен знать текущее состояние этой кнопки! – Narek

+0

Переопределение QDialog :: event() позволяет поймать каждый caps lock key, в сочетании с другими ответами здесь, чтобы получить фактическое состояние блокировки. См. например: https://github.com/savolai/Qt-Widgets-password-dialog-with-Caps-Lock-check – savolai

3

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

+0

что делать, если пользователь никогда не нажимает CapsLock во время tim e мое приложение работает :)? – Narek

+0

Это не работает на Macintosh, потому что AIUI закрывает ключ блокировки, просто делает все в верхнем регистре, даже когда Shift нажат. (Хотя я признаю, что это знание восходит к Системе 7, поэтому оно могло измениться в MacOS X.) –

+0

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

0

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

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

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

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

2

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

В этом случае this QT forum article has the answer:

#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.

+0

Спасибо, это работает. Нет ничего невозможного, нет? :) – Narek

+0

@Narek, ты сказал, что искал что-то независимое от платформы. –

+0

Это должно работать на WINDOWS и ... на Linux, MacOS (на окнах это работает!). – Narek

0

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

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

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

+0

Что означает фраза «Если вы пишете для KDE (а не общий Qt)» означает. Пожалуйста, подробно. – Narek

+0

http://en.wikipedia.org/wiki/KDE Это среда рабочего стола Linux, которую AIUI также может запускать в Windows или MacOS. –

+0

Я не понимаю, как использовать ... Не могли бы вы написать фрагмент кода? – Narek

1

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

Создать пару .h/файл .mm затем включить эти файлы в вашем файле про Qt следующим образом:

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); 
} 
0

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

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

Смежные вопросы