2

私は Cocoa アプリケーションのプラグインに取り組んでおり、既存の cpp コードを使用するために、Cocoa プラグインを Objective-C++ を介して既存の Qt プロジェクトと組み合わせることにしました。良い。

とにかく、私は現在の問題に困惑しています。このプラグインの設計は、アプリケーションが内部に 2 つの NSView を持つ NSWindow を提供するようになっています。これら 2 つのビューのいずれかの内部に QMacNativeWidget を配置すると、そこにあるすべてが正常に機能します。私が抱えている問題は、プラグイン内から新しい QDialog() を作成しようとすると、QDialog が常にプラグインを含む NSWindow の背後にあることです。

新しい QDialog を raise() するかどうかに関係なく、NSWindow は、QDialog へのキーボード フォーカスをすぐに失いますが、常に前面にあります。NSWindow を移動すると、その背後に QDialog が表示されますが、タイトルバーをクリックして移動しても、まだ NSWindow の背後にあります。

誰かが NSWindows と QDialogs を混在させることで同様の問題を抱えているかどうか、また QDialog を別の QMacNativeWidget にラップして別の NSWindow に配置する以外に解決策があるかどうか疑問に思っていました。多くのダイアログ。

ありがとう。

4

1 に答える 1

1

私は似たようなことをしています(ネイティブCocoaアプリへのプラグインとしてのQt)。nullの親を使用してモーダルQDialogを作成すると、アプリケーションモーダルとして動作し、最上位に留まります。あなたの問題は、非モーダルQMacNativeWidgetとモーダルQDialogを上に置くことに固有のものですか?正確なシナリオがあるかどうかはわかりません。QDialogをnullの親を持つように設定していますか?

回避策として、ウィンドウフラグを変更して、最上位の動作を強制することができます。

// Qt::Tool to stay on top
QDialog* d= new QDialog(0, Qt::Tool);
// And stop the tool window from disappearing on hide
d->setAttribute(Qt::WA_MacAlwaysShowToolWindow);

http://doc.qt.nokia.com/latest/qt.html#WindowType-enumを参照してください

または、QDialog'd'を指定してNSWindowsetLevelを試すこともできます(ここではキャストをスキップしています)。

[[d->winId() window] setLevel:some_level]
于 2011-11-09T21:18:12.560 に答える