2015-05-11 117 views
6

在我的Qt 5.3的應用程序,我想從一個子進程的GUI融入我的主進程的窗口:繪圖錯誤和崩潰與QWidget的:: createWindowContainer

  1. 子進程創建一個頂級QWidget
  2. 子進程通信的widget的WIdQWidget::winId()返回給父(使用IPC)。
  3. 父使用QWindow::fromWinId()QWidget::createWindowContainer()創建QWidget顯示子進程的GUI。這個小部件嵌入到另一個小部件的佈局中。

觀察:

  1. 孩子GUI顯示但不正確呈現:有沒有得到及時更新,當再次上漿父白色邊框。
  2. 如果父窗口調整得太小,由於Qt代碼中的內存訪問衝突,子進程崩潰。
  3. 如果我沒有指定QWidget::createWindowContainer()的父級來代替使用單獨的頂級窗口,那麼該子級就可以很好地嵌入。
  4. 當孩子打開一個模式對話框(如QMessageBox)後,該問題將自行修復,並且在父對象的下一個調整大小後,該子對象將被正確嵌入。

尤其是最後一點我感到困惑。我試圖找出是否運行QMessageBox更改子部件上的某些標誌,並且如果我可以手動模擬這些更改以解決問題,而不是運氣。

有沒有人有一個想法這裏發生了什麼?模式對話框可能會對修復問題的小部件做些什麼?

回答

3

首先,謝謝你這個問題。在此之前,我不知道Qt中的這個特性。我花了一些時間來實現您的解決方案,並有相同的問題:白色邊框。

幾次測試後,我嘗試做的飛行,而是白色邊框有本地OS邊框窗口重排根:

native borders after reparenting

它看起來就像當呼叫QWidget::createWindowContainer的Qt獲得整個窗口的大小,顯示QWidget (小於整個窗口的尺寸)並用白色填充背景。

我找到了解決這個問題的方法:在父窗口中調用createWindowContainer之前,設置了子窗口小部件的窗口標誌Qt::FramelessWindowHint

this->setWindowFlags(Qt::FramelessWindowHint); 

我無法重現調整大小後崩潰的問題。我添加子部件來佈局,它工作正常。

你可以看看我的example source at Git Hub

如果它不能解決您的問題與崩潰,請爲此問題提供一些來源。

注意:在GitHub上的示例中,我運行子項目,從調試輸出中讀取winId,修改父源,然後運行父項目。

+0

謝謝你的回答!因爲我現在不在辦公室,所以我會在週一的CET上嘗試一下您的建議並給予反饋。我很高興看到您的簡單解決方案是否有效! –

+0

耶,'FramelessWindowHint'修復了邊界渲染*和*崩潰!我很高興有這樣一個簡單的解決方案/解決方法。謝謝你,你贏得了賞金! :) –