QT-パスワードフィールド、Caps -Lockについて警告します
質問
パスワードフィールドがアクティブになっている間にCapsLockがオンになっていることをユーザー(ポップアップウィンドウ付き)に警告するQT-Builtinメソッドはありますか?
私は現在使用しています QLineEdit
(それはいいですか?) setEchoMode(QLineEdit::Password)
.
解決 4
私はすでにこの問題を吸収しました。 Qtooltipを使用しました QT- QlineEditにQtooltipを適用する方法 Caps Lock Statについてユーザーに通知する方法として、もちろん、現在の状態(getKeyState(VK_CAPITAL))を取得する関数を使用します。欠点:これはWindowsのみで機能します。
他のヒント
ユーザーがキーを押したら、それが上部ケースであるかどうか、シフトが保持されているかどうかを確認する必要があります。シフトが保持されず、入力が大文字である場合、キャップロックが点灯しています。また、シフトが減少し、入力が小文字の場合、キャップロックもオンになっています。
Veronique Lefrereからの投稿 QTの関心のあるメーリングリストには、ユーザーがキーを押すのを待つことができれば、回答があります。
イベントがqevent :: keypressの場合、qkeyventハンドラーまたはイベントフィルターでqt :: key_capslockタイプを待ちますか?
これを行うためのクロスプラットフォームQT-NATIVEの方法はないように思われるので、いくつかのプラットフォームに依存する方法を書きたいと思うかもしれません #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。
Macの場合、Caps Lockキーの状態を検出するには、次のことを行うことができます。
.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 );
}
KDEのために書いている場合(一般的なQTではなく)、使用してください kmodifierkeyinfo :: iskeylocked().
KModifierKeyInfo info;
info.isKeyLocked(Qt::Key_CapsLock)
(警告:このコードサンプルをテストしていません)
これは本当に聖書の答えへのコメントですが、それらを投稿するのに十分な担当者がいません:p。それは私が読んだものの単なるアイデアであり、私はそれを試したことがありません:s。
それはシフトが押されているかどうかを知る方法についてです、あなたは Qt :: keyboardModifiers それはaで検出できます QT :: KeyEvent?シフト修飾子があり、便利です。ところで、キーイベントでも検出できるQT :: key_capslockというキーがあることもわかりました。
そして、あなたの質問のナレックによるコメントのリンクにあるバグレポートのリンクを読むと、この機能は利用できないようです。しかし、ユーザーがキーを押すのを待つのを避けるために、Qlineeditに文字を入れるキーボードイベントを発射/シミュレートできるかもしれません。次に、Biberが言ったことを確認します。文字が上品で、シフトが押されている場合は...などを押し、最後にQlineeditの内容を削除します。うまくいけば、ユーザーがそれに気付くことを避けるのに十分な速さで起こるでしょう:p。
それはやや醜い回避策ですが、うまくいくかもしれません。それがそうであるかどうか教えてください!
Ken Bloomの答えに基づいて、これに関連する重要なUXパターンを示すQTプロジェクトの例を作成しました。特にオーバーライドQdialog :: event()は、毎回キャップロックをキャッチすることが重要でした。
https://github.com/savolai/qt-widgets-widgets-dialog-with-caps-lock-check