1. 程式人生 > >Qt 實現程序間視窗巢狀(一)

Qt 實現程序間視窗巢狀(一)

環境:Qt 5.9.1_msvc2015_64bit,Window 10.

為了實現在qt程式中開啟Window上其他應用程式,並將其嵌入到qt程式中。

方法:獲取外部程式的視窗控制代碼,呼叫

[static]QWindow *QWindow::fromWinId(WIdid)

函式建立QWindow,然後呼叫

[static]QWidget *QWidget::createWindowContainer(QWindow *window,QWidget *parent = Q_NULLPTR,Qt::WindowFlagsflags = Qt::WindowFlags())

建立一個QWidget即可。

關鍵之處在於如何獲取視窗控制代碼。

我們都知道Windows程式設計中,可以通過FindWindow系列的函式獲取HWND型別的視窗控制代碼(需要include windows.h標頭檔案),HWND型別和Qt中的WId型別可以轉換,所以通過FindWindow我們可以找到想要嵌入的視窗,不論是子視窗還是主視窗,即使是整個桌面也未嘗不可。

下面貼一下效果圖:

原程式:


這是嵌入之後的Qt程式:


可以看到,在這裡標題欄和邊框都消失了。很有意思的方法,好奇Qt是如何做到這種程序間的巢狀,這篇只是簡單介紹,待我研究透徹再來給大家分享。

如果不需要巢狀視窗的話,Qt也提供了其他的方法,不需要如此複雜。像QDesktopServices類,可以開啟本地應用程式(開啟檔案或網頁時,自動選擇預設的應用程式)。

一開始的目的,是想將office視窗顯示到qt程式裡面,採用的是activexQt模組,但activex的開發需要一定時間的積累,微軟的東西比較難用,加上activex只能開啟微軟自家的東西(有待驗證),而且如果以後不僅僅是顯示office呢?所以乾脆直接巢狀程序視窗,一勞永逸。

參考連結:http://blog.csdn.net/dazhong159/article/details/7903382 -如何獲取window視窗控制代碼