0

デバイスからのデータを分析して画面に表示するアプリケーションを作成しています。このデバイスを扱う SDK には、ウィンドウ ハンドラ (HWND) を設定することにより、現在のフレーム データを特定のウィンドウに表示する機能があります。

私の Qt Gui アプリケーションでは、ビデオ ストリーム上に独自のウィジェットを表示しようとしています。これは、QGLWidget に表示される DLL です (winId 関数と HWND によって設定されます)。MainWidget は、データ ストリームが表示される QGLWidget の親であり、QWidget (または Circle などのグラフィック マーカー) は、QGLWidget からのデータ ストリームの上に表示する必要があります。

すべてがほぼ完璧に機能しますが、まばたき効果 (きらめき効果?) が発生します - 私のサークル ウィジェットは、人間の目が得ることができる頻度で非表示になり、表示されます。それを排除する唯一のオプションは、このサークルをウィジェットとして作成し、その Qt::Popup フラグに設定することです。これには大きな欠点があります。残りのインターフェイスにアクセスできない (Popup フラグの障害であることはわかっています)。次のような他のオプションを試しました:

  • Qt::WindowStaysOnTopHint と他のいくつかのフラグを設定し、
  • 親がデバイスからのデータを表示しているQGLWidgetであるレイアウトオブジェクトを作成し、レイアウトのアイテムとして円ウィジェットを設定しますが、ここでは黒い背景が表示データをシェーディングしています(背景もオフにしましたが、気づいたウィジェットは外部ライブラリによって処理されるため、Qt はウィジェットの下にあるものを認識できません)。

ドキュメントで、ビデオ ストリームを処理するために独自の directshow+COM オブジェクト (またはインターフェイス、そうですか?) を作成できるという情報を見つけましたが、私はこのテクノロジをよく知らないので、このオプションをあまり避けたいと思っています。

[編集] データの現在のフレームを IPictureDisp インターフェイスとして取得できることがわかりましたが、前に述べたように、COM テクノロジはよくわかりません。IPictureDisp の操作方法について何かを見つけようとしましたが、COM テクノロジに関する基本的な知識がありません。誰かがそれについての良いチュートリアルを持っていますか?

4

1 に答える 1

0

このウィジェット階層を試してください:

MainWindget
|-QGLWidget
|-MarkerWidet

MarkerWidet小さな正方形のウィジェットにする必要があります。

を呼び出して、MarkerWidetが上にあることを確認します。ただし、呼び出す前に呼び出します。Qt に のエラーがあります。このエラーは を呼び出すことで解消されます。QGLWidgetMarkerWidet::raise()MarkerWidet::lower()MarkerWidet::raise()QWidget::raise()lower(); raise();

アプリケーションを起動したら、実際のウィジェット階層を確認し、Spy++ を使用して確認します。Spy++ は、Visual Studio のインストールに含まれているか、ここからダウンロードできます。

擬似コード:

MainWindget* mainWidget = new MainWindget;
QGLWidget* glWidget = new QGLWidget(mainWidget);
device->setHwnd(glWidget->winId());
mainWidget->show();
...
MarkerWidet* marker = new MarkerWidet(mainWidget);
marker->resize(30, 30);
marker->move(10, 10);
marker->lower();
marker->raise();
于 2013-01-25T14:39:29.987 に答える