2013-09-06 15 views
6

状況:ボーダーレスQDialogは他のアプリケーションの上に正常に留まります。アプリケーションのアクティベーションを避け、ボタンをクリックしたときにフォーカスを当てる - Windows APIまたはQt

問題は、この最前面のアプリケーションウィンドウをクリックすると、次のことが発生している:

  • ザ・が常に最前面のアプリケーションが
  • クリック常に最前面のアプリケーションを起動しますクリックウィンドウには、可能性がある前のアクティブ/集中アプリ

の焦点を盗み、この最前面非アクティブにし、焦点の合っていないアプリケーションのウィンドウをクリックすると、その

  • 現在のアプリケーションは、常時オンのアプリケーション(ボタンやドロップダウンメニューを押しながらウィンドウをドラッグ)とやりとりできている間に、アクティブ化とフォーカスを失いません。

私はQtを使用していますが、ネイティブWindows APIの使用については問題ありません。

私は、次のQt windowFlagを試してみました:

  • Qt::WindowDoesNotAcceptFocusが、それは動作しません:最前面のアプリケーションは、アクティブに焦点を当てています。
  • Qt::WindowTransparentForInputのように、常時オンのアプリケーションはクリックに対して透過的です。アクティブではなく、フォーカスが当たっていませんが、ヒットするとボタンは残念ながら起動しません。

答えて

5

Windowsのフラグ(#include <qt_windows.h>)を使用してウィンドウをクリックすると、ウィンドウが非アクティブになり、フォーカスが失われることがあります。

HWND winHandle = (HWND)winId(); 
ShowWindow(winHandle, SW_HIDE); 
SetWindowLong(winHandle, GWL_EXSTYLE, GetWindowLong(winHandle, GWL_EXSTYLE) 
    | WS_EX_NOACTIVATE | WS_EX_APPWINDOW); 
ShowWindow(winHandle, SW_SHOW); 
+0

ええと、どうしてQtでこれをやっていますか? 'winEvents'をオーバーライドしますか? – swdev

+1

'showEvent()'をオーバーライドできます。その実装のためには、まず上記のコードを親メソッドと呼んでください。 – Derek

+0

Not successful :) 'showEvent()'をオーバーライドして、PyWinライブラリを使ってコードをPyQtに移植したところ、すでに成功していますが、私がメインウィンドウが非アクティブになることを想定してコントロールをクリックすると、何か案が? – swdev

1

私はQDialogについてよくわかりませんが、同様の目的(Windows 8スタイルの通知を表示)でQWidgetを使用しています。

てみ設定:

dialog->setFocusPolicy(Qt::NoFocus); 
dialog->setAttribute(Qt::WA_ShowWithoutActivating); 

多分あなたはすべての子供たちに焦点を当てポリシーを設定する必要があります。

+0

おかげでheadsvkが、それは常に一番上のフラグによってオーバーライドされます::以下は、ウィンドウが作成され、表示された後に使用する必要があります 'dialog-> setWindowFlags(windowFlags()| Qtの:: WindowStaysOnTopHint);'このフラグは 'Qt :: WA_ShowWithoutActivating'属性と競合しているようです。 – Derek

+0

実際には、Windowsでは(WindowStaysOnTopHintを使用しなくても)動作しませんが、Macでは競合が発生します。私はMainWindow、次にQDialog、そして最後にQWidgetを使ってテストしました。 – Derek

+0

私は 'Qt :: WindowStaysOnTopHint'も使用しています。そこで、ポップアップにボタンを追加しようとしましたが、クリックすると、アクティブなウィンドウからフォーカスが奪われることはありません。フラグはどのように矛盾しますか? – headsvk

関連する問題