4

QWidget::winIdのドキュメントには、 (とりわけ) 「ウィジェットが非ネイティブ (エイリアン) であり、winId が呼び出された場合、そのウィジェットにはネイティブ ハンドルが提供されます」と記載されています。

その文脈で「エイリアン」が何を意味するのかはわかりませんが、今のところ無視することにしました. :)

私のウィジェットに有効なネイティブ ハンドルが関連付けられていると仮定すると、そのネイティブ ハンドルを別のプロセスに渡してQWidget::findに渡し、その 2 番目のプロセス内で有効な QWidget オブジェクトを取得できますか?

おそらく、ウィジェットを表示/非表示にして親ウィジェットにアタッチする以外に、2 番目のプロセスでウィジェットに対して他に多くのことを行う必要はありません。(最初のプロセスで親ウィジェットにアタッチされず、最初のプロセスのコンテキストで表示されないことが保証されています)。

上記のすべてが機能する場合:

  1. 2 番目のプロセスは、そのウィジェットをどの程度制御できますか?

  2. 最初のプロセスは、最初のプロセスの UI にアタッチされているかのようにユーザー入力イベントを受け取り、最初のプロセスは通常どおりウィジェットを更新できますか?

ジェームズ

4

1 に答える 1

2

Qt のソースを見てみましょう。

QWidget *QWidget::find(WId id)
{
    return QWidgetPrivate::mapper ? QWidgetPrivate::mapper->value(id, 0) : 0;
}

find()含まれている場合にのみ、ウィジェットを見つけることができますmapper。はmapper静的QHash<WId, QWidget *>変数です。メソッド内でのみ、このハッシュに項目が挿入されQWidgetPrivate::setWinIdます。

そのため、 を持つウィジェットがWId別のプロセスで作成された場合、 を使用してそれを見つけることはできませんQWidget::find。この関数は、ウィジェットを検索するためにネイティブ OS 関数を使用しません。

Qt ドキュメントのエイリアン ウィジェットの一般的な説明も参照してください。

Qt 4.4 で導入されたエイリアン ウィジェットは、ウィンドウ システムに認識されないウィジェットです。これらには、ネイティブ ウィンドウ ハンドルが関連付けられていません。この機能により、ウィジェットのペイント、サイズ変更、ちらつきの除去が大幅に高速化されます。

于 2013-06-26T19:13:28.423 に答える