Qt實現兩個窗口重疊,下層播放視頻,上次透明顯示方框

最近要實現一個功能,在播放着的視頻上動態顯示方框,類似於深度學習物體識別中經常見到的方框圖。如下圖:

動手!

1、

下層窗口播放視頻,上次透明畫方框

    setWindowFlags(Qt::FramelessWindowHint); 
    setAttribute(Qt::WA_TranslucentBackground);//窗口設置透明

設置完運行 ?!  Qt控件在透明窗口之下沒被遮擋,但也沒有視頻界面

 挪開方框一看,果然是被擋住了。。

2、在網上看到一篇文章,感覺能解釋清楚這個問題(正確性不敢保證)

windows下的透明是通過layered window實現的. Qt的透明窗口也是如此, 屬於directui. 整個窗口只有一個winId(windows下即HWND). 
但是 opengl和directx都需要一個handle來繪製渲染. 
而Qt的窗口中, 如果某個子Widget獲取了winid. 則打破"directui". 窗口中的所有widget都會擁有handle. 
因此透明窗口是無法單獨把某個widget交給opengl或direcxt渲染的. 

那是不是可以通過分離這兩個窗口,做成兩個獨立窗口來顯示。(子窗口獨立構造,設置parent爲空)

 

 

任務欄顯示兩個圖標,只需要在子窗口的windowFlags中加入Qt::SubWindow。

點擊主窗口按鈕又會將子窗口擋在後面,再加入Qt::WindowStaysOnTopHint,哎,可以了

!!!!

emmmm,好吧,還是不行,就算可以在父窗口hideevent中設置子窗口同時hide,又但是!

子窗口置頂還是過於影響體驗。

3、開啓一系列嘗試,聽說可以將父窗口指針放入子窗口構造,設置raise()

---Raises this widget to the top of the parent widget's stack.

(這是跟上一條相違背。父子窗口不能有聯繫。)還有試過stackUnder(childWidget);重寫事件event強行將子窗口置於上方都無法做到能用的程度。

4、翻閱無數網頁,最終看到了某位大佬的回覆


將視頻上面的控件設置爲Tooltip + 透明背景。另外,控件設爲tooltip之後,它的座標就不再跟隨父窗口而是全局。因此需要對它的座標做特殊的處理。
借用大佬的截圖(在視頻上覆蓋一層透明控件,根據鼠標操作在上面畫虛線框):

果然是解決了(注意:這邊還是要將父窗口放入子窗口的構造函數中)

看一下文檔

指示該小部件是工具窗口。 工具窗口通常是一個比通常的標題欄和裝飾要小的小窗口,通常用於工具按鈕的集合。 如果有父級,則工具窗口將始終保留在其頂部。 如果沒有父母,您也可以考慮使用Qt :: WindowStaysOnTopHint。 如果窗戶系統支持它,則可以用較輕的框架裝飾工具窗口。 它也可以與Qt :: FramelessWindowHint結合使用。

在Mac OS X上,工具窗口對應於窗口的浮動類。 這意味着該窗口位於普通窗口之上的水平; 無法在其頂部放置普通窗口。 默認情況下,當應用程序處於非活動狀態時,工具窗口將消失。 這可以由Qt :: WA_MacAlwaysShowToolWindow屬性控制。

      實現原理我也無從找起,看後半段文檔的意思,應該有點類似Qt::WindowStaysOnTopHint,只不過是在這父子窗口的小世界裏設置了子窗口置頂。(注意關聯父子窗口的hide時間,不然會出現子窗口出現在本應用的其他界面之上)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章