パスワードフィールドがアクティブなときにCapsLockがオンになっていることを(ポップアップウィンドウで)ユーザーに警告するQt組み込みの方法はありますか?
私は現在QLineEdit
(それは良いですか?)で使用していsetEchoMode(QLineEdit::Password)
ます。
ユーザーがキーを押したら、それが大文字かどうか、およびシフトが保持されているかどうかを確認する必要があります。シフトが保持されず、入力が大文字の場合、Caps Lock がオンになります。また、シフトが下にあり、入力が小文字の場合、Caps Lock もオンになります。
これを行うためのクロスプラットフォームの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イベント処理を行わない場合は、sを行う必要はありません#undef
。
QT Interest メーリング リストのVeronique Lefrere からの投稿には、ユーザーがキーを押すのを待つことができるかどうかの回答があります。
イベントが QEvent::KeyPress の場合、qkeyevent ハンドラまたはイベント フィルタで Qt::Key_CapsLock タイプを待ちます
私はすでにこの問題を解決しました。私は QToolTip QT - How to apply a QToolTip on a QLineEditをユーザーに caps lock stat について通知する方法として使用し、もちろん現在の状態を取得する関数 (GetKeyState(VK_CAPITAL)) を使用しました。欠点: これは Windows でのみ機能します。
KDE (汎用 Qt ではない) 用に作成している場合は、KModifierKeyInfo::isKeyLocked()を使用します。
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(警告: このコード サンプルはテストしていません)
これは実際にはBiberの回答に対するコメントですが、それらを投稿するのに十分な担当者がいません:P. それは私が読んだことの単なるアイデアであり、試したことはありません:S.
シフトが押されたかどうかを知る方法についてですが、 Qt::KeyEventで検出できるQt::KeyboardModifiersを見たことがありますか? シフト修飾子があります。便利かもしれません。ところで、キー イベントでも検出できる Qt::Key_CapsLock というキーがあることもわかりました。
そして、あなたの質問のナレクによるコメントのリンクにあるバグレポートのリンクを読むと、その機能が利用できないようです. しかし、ユーザーがキーを押すのを待つのを避けるために、QLineEdit に文字を入れるキーボード イベントを起動/シミュレートすることができます。次に、ビーバーが言ったことを確認します。文字が大文字でシフトが押された場合...など。最後に、QLineEditの内容を削除します。うまくいけば、ユーザーがそれに気付くのを避けるのに十分な速さで発生します:P.
これはやや醜い回避策ですが、うまくいくかもしれません。もしそうなら教えてください!