2013-01-25 49 views
0

我創建應用程序從一個設備分析數據,並在屏幕上顯示它處理裝置顯示的QWidget。通過設置窗口處理程序(HWND),處理此設備的SDK具有在特定窗口中顯示當前數據幀的功能。如何將數據流從上述通過外部庫

在我的Qt GUI應用程序我試圖顯示自己在視頻流部件,這在我的QGLWidget來繪圖顯示一個DLL(它是由winId功能和HWND設置)。 MainWidget是顯示數據流的QGLWidget的父級,QWidget(或某些圖形標記,例如Circle)應顯示在來自QGLWidget的數據流上方。

一切工作幾乎完美,但我得到眨眼效果(閃爍效果?) - 我的圈子小部件是隱藏和顯示人眼可以得到的頻率,我儘量避免它。,以排除唯一的選擇是創建這個圈子小窗口,併爲它的Qt ::彈出標誌設置,通過它有很大的缺點 - 我沒有訪問接口的其餘部分(我知道,這是彈出標誌故障)。我已經試過其他選項,如:

  • 集合Q :: WindowStaysOnTopHint和其他幾個旗,
  • 創建佈局對象,父母是QGLWidget來繪圖,在那裏我從顯示設備的數據,並且低於設定圈widget作爲但是這裏的黑色背景是陰影顯示的數據(我甚至關閉了背景,但我意識到Qt無法知道我的小部件下面是什麼,因爲它是由外部庫處理的)。

在文件我發現我可以創建自己的DirectShow + COM對象的信息(或接口,對嗎?),以處理視頻流,但我真的不知道這個技術,我想避免此選項,許多!

[編輯]我發現我可以把數據作爲IPictureDisp接口的當前幀,但正如我前面說的我真的不知道COM技術。我試圖找到一些關於如何與IPictureDisp一起工作,但我沒有關於COM技術的基本知識。有人有任何好的教程嗎?

+1

什麼是不工作?我無法弄清楚問題所在。您是否試圖在**外部進程**上顯示Qt小部件?或者是在你的進程**中顯示一個HWND **的DLL?你的問題現在有點混亂,你可以編輯它並刪除不相關的信息,如果它是COM/DirectShow,它有什麼關係?此外,請將您的問題分段。 – sashoalm

+0

感謝您的建議。我糾正了我的帖子。現在,我希望它有我想要的信息。 –

+0

我仍然不明白問題是什麼。你想達到什麼目的,它是如何失敗的?你不知道如何讓孩子QWidget或什麼?並且不要添加關於您的項目的所有不相關的信息,或者爲什麼您需要它。只是說「我想讓一個QWidget成爲另一個的孩子」 – sashoalm

回答

0

試試這個小部件層次:

MainWindget 
|-QGLWidget 
|-MarkerWidet 

MarkerWidet應該是小方形小部件。

通過調用MarkerWidet::raise()確保MarkerWidet高於QGLWidget。 但調用MarkerWidet::raise()之前調用MarkerWidet::lower()。 Qt與QWidget::raise()錯誤,通過調用lower(); raise();可消除此錯誤。

開始您的應用程序檢查實際的小部件層次結構後,可以使用間諜++做到這一點。可以在Visual Studio安裝中找到Spy ++,或者下載here

僞代碼:

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(); 
+0

非常感謝您指導我走向正確的道路! **,這個閃爍的問題是我的錯。我在小部件層次結構中犯了錯誤 - Circle小部件有NULL父項。當我將MarkerWidget的父代更改爲mainWidget時,即使使用show()函數,一切仍然正常。然而raise()不起作用。 –

+0

我不明白,問題解決了嗎? 關於raise(),我編輯了答案,它以前的版本可能不正確。你可以嘗試新的代碼示例嗎? –

+0

我有幾天休息時間,並回到這個問題。我很抱歉,你必須等待幾乎整整一週的答案。那麼,早期的解決方案不起作用,但現在一切工作都完成了!非常感謝你! –

相關問題