質問

パスワードフィールドがアクティブになっている間に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の方法はないように思われるので、いくつかのプラットフォームに依存する方法を書きたいと思うかもしれません #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イベント処理を行わないようにする場合、 #undefs。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top