2013-09-29 27 views
1

previous question,他們給我的代碼,顯示heightForWidth()(感謝,@Kuba奧伯),工程的實施,但都僅在頂級QWidget一樣。我試圖重現它爲QMainWindow,但它沒有奏效。了QWidget :: heightForWidth()和QMainWindow的

這是代碼,其中heightForWidth()作品的頂級QWidget

QWidget w; 
QVBoxLayout * l = new QVBoxLayout(&w); 
l->addWidget(new Widget); 
w.show(); 

而這正是我試圖實施的QMainWindow相同,但在這裏它heightForWidth()沒有效果(即使它會稱爲):

QMainWindow mainWnd; 
QWidget *w = new QWidget; 
QVBoxLayout * l = new QVBoxLayout(w); 
l->addWidget(new Widget); 
mainWnd.setCentralWidget(w); 
// Second widget to take unused space. 
QFrame * btm = new QFrame; 
btm->setFrameShape(QFrame::Panel); 
btm->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
l->addWidget(btm); 
mainWnd.show(); 

那麼爲什麼QMainWindow實施工作?

+0

1.當您添加一箇中央控件時,設置其父控件是多餘的。文檔說:* QMainWindow獲取窗口小部件指針的所有權,並在適當的時候刪除它。* –

+0

2.如果一個'QObject'在任何時候都有它的父集*,無論是在創建時還是在以後,都必須在免費店鋪。這可能只是示例代碼中的一個錯字,但我想強調一下。 –

+0

我認爲問題的一部分是''''widthForWidth()'是爲了交換機制,在這裏你交換一個。當width()增長時,高度不能增加。如果它恰好適用於簡單的佈局,那麼更多的勝利,但我認爲它並不是真正用於這種方式。 Qt本身*總是*使用它,因此當你增加寬度時,高度永遠不會增加。它要麼保持不變或減少。想想菜單欄或其他包裝文本。 –

回答

0

首先請注意,QMainWindow要求要將設置爲中央控件,即使它是佔位符。

然後,您需要做的就是擁有一個帶有佈局的佔位符小部件,就像您已經做過的那樣,然後只需將兩個小部件放在裏面:您想要保留的小部件,以及佔位符挑選未使用的空間。

或者,您爲什麼要堅持小工具是正方形?只需在內部繪製方形部分,然後用默認背景角色清除其餘部分。

+0

我試着添加一個'QFrame'作爲第二個小部件,就像在你的代碼中的前一個答案(見我的編輯),但它不似乎改變了一切 - 「方形」小部件仍然佔用了「QMainWindow」的所有可用空間。至於想要一個方形的小部件,我認爲這是更正確的方法來做到這一點。另一個解決方案有點駭人聽聞,我不認爲widget應該有未使用的區域。可能我可以使用自定義佈局嗎? – sashoalm

+0

如果您將整個容器小部件從其他答案放入中央控件,它不應該改變內部的行爲。如果是這樣,這是一個錯誤。 –

+0

好的,我剛剛測試過了,我把QWidget作爲QMainWindow的中心部件放在前面的答案中,它不起作用,而如果我將它作爲頂層部件展示,它就可以工作。 – sashoalm

相關問題