43

アプリのメイン ウィンドウでマウスとキーボードのイベントを無視し、ウィンドウ マネージャーの Z オーダーでその下にあるアプリケーションに渡すようにします。

ウィジェットがキーボードまたはマウス イベントを無視するようにする方法はわかりましたが、メイン ウィンドウはどうでしょうか。

常に背景のすぐ上にあり、キーボードやマウスのイベントからはまったく見えないデスクトップ ウィジェットを作成しようとしています。(通過)

Qt::X11BypassWindowManagerHintはキーボード パス スルーを取得します (悲しいことに X11 固有ですが、今のところ問題ありません)。マウス イベントはどうですか?

キーボードイベントを透過的にする OS に依存しない方法はありますか?

編集:

ここでのキーワードは透明性です。

マウスとキーボードのイベントを食べたくありません。ウィンドウマネージャーに、それらがまったく必要ないことを知ってもらいたいのです。これらのイベントは、zorder で私の管理下にあるアプリケーションに送信する必要があります。

たとえば、ウィジェットで覆われているデスクトップ アイコンをクリックして、ウィジェットが存在しないかのように操作できるようにしたいと考えています。

4

6 に答える 6

12

次の解決策を見つけました(Linuxでテストされ、@ TheSHEEEPによるとWindowsでも動作します):

setWindowFlags(windowFlags() | Qt::WindowTransparentForInput);

最近のqtリリースに追加されました(いつ見つけられませんでした)http://doc.qt.io/qt-5/qt.htmlを参照してください

于 2016-08-03T19:56:50.717 に答える
11

Windowsでは設定できますWS_EX_TRANSPARENT

Qt でこれを行うには、次のコードを使用します。

ヘッダーを含め、

#if _WIN32
    #include <windows.h>
#endif

次のコードをコンストラクターに入れます。

#if _WIN32
    HWND hwnd = (HWND) winId();
    LONG styles = GetWindowLong(hwnd, GWL_EXSTYLE);
    SetWindowLong(hwnd, GWL_EXSTYLE, styles | WS_EX_TRANSPARENT);
#endif
于 2011-02-08T08:25:48.547 に答える
8

多分あなたが欲しいのは

widget->setAttribute(Qt::WA_TransparentForMouseEvents)

? これは、親がマウス イベントを処理できるようにするために QRubberBand が使用するものです。キーボード イベントに関しては、自身に focusPolicy() を設定しない限り、QWidget はキーボード イベントを取得しません。

setFocusPolicy( Qt::NoFocus );

したがって、キーボード イベントを処理する必要があります。

于 2009-07-10T11:27:22.503 に答える
2

ここで何かが足りないのかもしれませんが、QMainWindow クラスをサブクラス化し、QWidget::event()メソッドをオーバーライドして常に false を返すようにしましたか? いくつかのイベントを処理する必要がある場合は、そのインテリジェンスもここに追加できます。

この手法を使用すると、アプリケーションに着信するイベントを検査し、必要に応じて、イベント フィルターを使用してそれらを食べることなく無視することができます。

これが機能しない場合は、QCoreApplication::notify()を呼び出し、 QApplication::desktop()を呼び出して取得したデスクトップ ウィジェットにイベントを渡すことで、イベントをデスクトップにリダイレクトすることができます。これがうまくいくかどうかはわかりませんが、試してみる価値はありそうです。

于 2009-06-19T17:20:50.047 に答える
1

オーバーライドは機能するはずだと思います:

bool YourMainWindow::event( QEvent *event )
{
   event ->accept();
   return true;
}

これは、QWidgetクラスのドキュメントがevent()メンバー関数について述べていることの一部です。

この関数は、イベントが認識された場合はtrueを返し、それ以外の場合はfalseを返します。認識されたイベントが受け入れられた場合(QEvent :: acceptedを参照)、親ウィジェットへのイベントの伝播など、それ以降の処理はすべて停止します。

于 2009-06-16T18:52:25.600 に答える
1

Qt のイベント フィルターを使用します。アプリケーションは、指定したイベント (つまり、キーボード イベントとマウス イベント) を食べることができますが、ペイント イベントなどの他のイベントも処理できます。

bool FilterObject::eventFilter(QObject* object, QEvent* event)
{
    QKeyEvent* pKeyEvent = qobject_cast<QKeyEvent*>(event);
    QMouseEvent* pMouseEvent = qobject_cast<QMouseEvent*>(event);

    if (pKeyEvent || pMouseEvent)
    {
        // eat all keyboard and mouse events
        return true;
    }

    return FilterObjectParent::eventFilter(object, event);
}
于 2009-06-18T14:08:42.953 に答える