2013-08-27 68 views
7

在我們的項目中,我們有三個獨立的應用程序,我們必須開發一個QT控制應用程序來控制這三個應用程序。主窗口將分爲三個子窗口 - 每個窗口顯示另一個應用程序。
我想用QX11EmbedWidgetQX11EmbedContainer窗口小部件,但有兩個問題與:QT如何將應用程序嵌入QT部件

  1. 的QX11Embed *基於X11協議,如果支持非X11系統,如Windows操作系統的我不知道。
  2. 由於QT 5這些類不存在,並且QT文檔沒有提到原因。

所以我不知道是否使用它 - 我會很樂意得到答案。
此外,我看到QT 5.1包含QWidget::createWindowContainer();函數,在某些帖子中,它看起來應該是X11Embed的替代品。任何人都可以請更多地說明我如何使用這個函數來創建一個QT小部件,它將在其內部運行另一個應用程序(例如計算器)?

我在谷歌搜索了很多,並沒有找到我的問題的答案。
任何人都可以幫我嗎?我是否正確?
謝謝!

回答

8

如果所有三個獨立的應用程序都是用Qt編寫的,並且您有它們的源代碼,那麼您應該能夠通過Qt中的GUI對象的父項來統一它們。

http://qt-project.org/doc/qt-4.8/objecttrees.html

http://qt-project.org/doc/qt-4.8/widgets-and-layouts.html

http://qt-project.org/doc/qt-4.8/mainwindows-mdi.html

如果沒有以這種方式訪問​​他們,是什麼你談論像第三方窗口管理。這有點像編寫一個shell,比如Windows資源管理器,它可以操縱其他窗口應用程序的狀態和大小。

使用Spy ++或AutoIt Spy for Windows等程序或其他操作系統的類似程序,並學習要控制的窗口的標識標記,如類,窗口標題等。或者你可以自己啓動exe文件在QProcess::startDetached()之類的東西。

http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html#startDetached

然後使用與操作系統相關的呼叫控制窗口。 Qt庫沒有內置第三方窗口的內容,僅適用於您啓動的QApplication下的內容。有很多AutoHotKey或AHK做這樣的事情的例子。它是一種腳本語言,用於在Windows環境中自動化很多事情,並且還有用於Mac的端口(儘管我自己並沒有嘗試過Mac端口)。

那麼,到底你在尋找像這樣的調用可能找到你的窗口:

#include <windows.h> 

HWND hwnd_1 = ::FindWindow("Window_Class", "Window Name"); 
LONG retVal = GetWindowLongA(hwnd_1, GWL_STYLE); // to query the state of the window 

然後操縱窗口的位置和狀態,像這樣:

::MoveWindow(hwnd_1, x, y, width, height, TRUE); 
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED); 

你可以甚至可以在您正在控制的窗口頂部繪製小部件,如果您正在爲正在操作的窗口設置正確的窗口標記。

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

所出現在Windows做這一切時的一些陷阱,是查不到的Windows用戶界面的怪癖,當他們設置顯示與預期的比例不同,如果你想玩任務欄,並處理你正在操作的程序的所有模態窗口。

總體而言,它是可行的。 Qt將爲執行這些命令提供一個很好的界面,但最終你會看到大量的工作和調試,以便將其置於一個美觀,可靠的窗口管理器中。

希望有所幫助。

+1

首先謝謝你回答我,我開始認爲沒有人能回答我。我沒有訪問源代碼。 2問:你對QWidget :: createWindowContainer()有什麼瞭解?功能,它可以做所有的工作嗎? 2.如果你的解決方案需要大量移植到windows - 也許這是不值得的 - 而且縮短的解決方案是在.NET中爲Windows編寫應用程序,並且我不知道Linux-Ubuntu? – RRR

+0

我以前沒有用過'createWindowContainer'。它看起來像升級任何'QWindow'類似於場景圖或Qt Quick或OpenGL窗口的快捷方式,以便具有可與其他QWidgets一起使用的完整窗口裝飾。它看起來不像是可以取任何HWND ID ... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

處理窗口不是太困難。它確實需要研究和工作,但在Windows中啓動和操作它們不應超過幾個小時。我還沒有在Linux和OSX上做到這一點,但它應該只是一個恰當的調用。 – phyatt

6

我從來沒有嘗試過自己,但在Qt的5.1的文檔我會嘗試QWindow :: fromId(WID ID),它給你一個QWindow,這應該是嵌入與createWindowContainer:

QWindow * QWindow :: fromWinId(WId id)[靜態]創建由另一個進程創建的窗口的本地 表示,或者使用Qt下的本地庫創建 。

給定處理ID到本地窗口,此方法創建一個QWindow對象,可以在調用方法 (如setParent()和setTransientParent())時用於表示窗口。這可以在支持它的平臺上使用,以便在容器中嵌入一個窗口,或者在另一個進程創建的窗口頂部創建窗口。

但是沒有保證。 :-)

+0

我們究竟能夠獲得句柄ID到外部應用程序(通過QProcess創建)? – user3079474

+0

越野車! https://bugreports.qt.io/browse/QTBUG-40320 :) – mlvljr