2014-09-23 17 views
1

情況:我的應用程序的中央物件我有一個QMdiArea在分頁模式(包裹在從繼承QMdiArea自定義類) 。當我現在添加第一個QMdiSubWindow通過addSubWindow()一切都仍然很好,這意味着窗口及其內容被最大化佔據了QMdiArea的所有空間。但是,只要添加第二個子窗口,就會出現以下問題:QMdiArea:一是標籤工作正常,第二個選項卡的內容來說太小了

問題:不顯示第二個窗口的內容,而是從第一個窗口的內容繼續(儘管事實上第二個標籤視覺上具有焦點),但尺寸減小。它只佔用幾個像素。但是,如果我現在切換回第一個子窗口/選項卡(通過點擊縮小尺寸的窗口小部件,然後自動返回到最大尺寸或選擇第一個標籤頁眉),然後再次選擇第二個窗口,第二個選項卡的小部件/編輯器現在顯示並被最大化。

但是,直到我關閉第二個標籤,在這種情況下,第一個內容纔會顯示(如預期的那樣),但同樣只有小尺寸!

截圖: Screenshot outlining the issue

另一個相關的測試用例:1標籤,創建並顯示全尺寸的預期。如果我現在只是調整總體大小,我的選項卡上的小部件周圍突然出現一個模糊的邊框。所以它似乎處於最大化和正常模式之間的邊界混合狀態。這是否創造了任何新的線索?

截圖:

Screenshot outlining the related issue

我至今沒有使用任何明確定義的佈局

,但考慮到第一個標籤工作正常,手動回往復切換所有其他人也後,我認爲它應該沒有工作。

我是否需要設置顯式佈局對象?爲什麼它適用於第一個標籤,但不是第二個標籤?

一些代碼爲基礎:這是我的自定義QMdiArea類,它增加新的兒童照顧執行的邏輯:

// Note: pEditor inherits from/is a QMdiSubWindow itself 

if(!pEditor->isInitialized()) 
{ 
    pEditor->initialize(); 
    pEditor->setWidget(pEditor->getEditorWidget()); 
    pEditor->setInitialized(true); 
} 

pEditor->beforeDisplay(); 

addSubWindow(pEditor); 
pEditor->showMaximized(); 

// HACK START 
pExisting = subWindowList().at(0); 
if(pExisting) 
    setActiveSubWindow(pExisting); 
// HACK END 

更新:增加黑客proposed by N1ghtLight。在編碼中標記爲這樣。

更新2:編輯/正確的問題描述+帶有屏幕截圖的新測試用例。

+0

是否嘗試過爲QMdiSubWindow創建的新的pEditor實例調用void QMdiArea :: setActiveSubWindow(QMdiSubWindow * window)?例如,在addSubWindow(pEditor)之後調用它。此外,我想知道是否需要調用showMaximized。 – 2014-09-25 19:08:25

+0

@ N1ghtLight:這不會改變任何東西。新標籤已經激活(請參閱我新添加的截圖)。關於'showMaximized()':如果我忽略它,那麼子窗口內的小部件根本就不會顯示,因爲它永遠不會被設置爲* visible *。 – 2014-09-25 19:15:47

+0

現在,醜陋的解決方法確實可以調用setActiveSubWindow兩次 - 對於一些可用的子mdi,然後是新創建的子。這應該模擬當你先點擊然後返回秒時的情況。此外,我有一種感覺,以前的時候,當我用mdi(3年前)我有同樣的問題,只是停在這樣醜陋的解決方法:) – 2014-09-25 19:39:38

回答

1

經過幾個小時的比較,從N1ightLight的示例項目到我自己的實現,我終於遇到了中心差異。實際上有在玩兩個問題:

  1. 出於某種原因,我不得不在創造我的MDI子窗口,這顯然是搞砸了大小處理以下行。擺脫這條線消除了以前提出的黑客的任何需要。結合N1ghtLight提出的佈局,現在所有尺寸的變化都可以正常處理。

    setWindowState(Qt::WindowMaximized); // do not use that state! 
    
  2. 關於標籤關閉(關閉一個tab沒有彈出一個選項卡中的預期方式和大小)的第二部分,Qt文檔中居然解釋說:

    當你創建你自己的子窗口,如果你想在MDI區域關閉時刪除窗口,你必須設置Qt :: WA_DeleteOnClose小部件屬性。如果沒有,窗口將被隱藏,並且MDI區域不會激活下一個子窗口。

    由於我創建了自己的子窗口,我必須設置該標誌,但是我從來沒有這樣做過,因爲我想阻止Qt自動刪除我的內容小部件。我現在的解決方案是設置標誌,但是每當一個MDI孩子即將關閉時,我將刪除指向該控件的鏈接,因此Qt無法刪除它。

    void CustomMDIWindow::closeEvent(QCloseEvent* pEvent) 
    { 
        setWidget(0); 
        pEvent->accept(); 
    } 
    

我將迎來我自己的答案是正確的,但將頒發賞金N1ightLight因爲他的支持最終導致我找到最終的解決方案。

0

醜陋的解決方法確實可以是兩次調用setActiveSubWindow():首先爲一些可用的子窗口,然後爲新創建的一個。當你點擊第一個標籤然後返回到第二個標籤時,這應該可以模擬這種情況。

+0

正如我現在編輯/糾正的問題描述中所解釋的,這僅解決了製表符創建階段。當我關閉一個現有的標籤時,我遇到了相同/相似的問題。鑑於此時只剩下一個選項卡,沒有第二個選項卡通過'setActiveSubWindow()'臨時切換。 – 2014-09-30 10:25:09

相關問題