2011-08-11 40 views
6

我試圖讓一個應用程序包含一個QMainWindow,它的中心部件是一個QToolBar(它可能不是通常的,但爲我的目的工具欄的非常適合)。碼頭只允許在下面。我向其中添加了QDockWidgetQToolBar上的QActionremoveDockWidget()restoreDockWidget()打開和關閉QDockWidget如何在刪除所有DockWidgets後調整QMainWindow大小?

QMainWindow的默認尺寸是800乘以24,QToolBarmaximumHeight也設置爲24。在調用removeDockWidget()之後,QMainWindow的幾何被重新設置爲(0,0,800,24)setGeometry()

我想要實現的是在DockWidget被刪除時將QMainWindow的高度調整爲24。 setGeometry()似乎工作,因爲寬度和位置相應地改變,但有趣的是,高度不會變差。這就是我的問題:)

你覺得怎麼回事?

Here is a screen-cast說明手頭的問題。

NB:如果我創建使用一個QWidget,而不是QMainWindow的,並使用一個show()hide()的子部件相同的情況下,那麼我可以用adjustSize()沒有問題調整父:在這裏,似乎上面的問題是QMainWindow的具體。

+0

你可以給鏈接到您的代碼?你使用的是哪個版本的Qt? –

回答

2

選項

a)您可以重載size​​Hint()一個虛函數。讓它返回你想要的主窗口大小。

b)在主窗口的構造函數中,您可以一個接一個地調用setMinimumSize()和setMaximumSize(),它們都具有所需的主窗口大小。如果你保持一致,你會得到一個固定的大小。

c)看看layout() - > setResizeMode(Fixed)。

+0

謝謝。我不確定我是否按照你的解釋。我試圖用updateGeometry()更改QmainWindow的幾何圖形,但它確實不起作用。我將上面的代碼放在輸出中,向你展示我的意思。 – Benjamin

+0

檢查我的答案,看看它是否有意義:) – Benjamin

+0

@Benjamin ...你嘗試重載size​​Hint或調用setMinimumSize()和setMaximumSize()?如果是,那麼你是否得到了你想要的大小? –

1

看起來你錯誤地理解了QMainWindow.sizeHint()方法的含義。

根據QWidget.sizeHint() documentation(從中QMainWindow繼承):

這個屬性保存的插件的推薦的大小

如果此屬性的值是無效大小,建議不要使用大小。 如果此小部件沒有佈局,sizeHint()的默認實現將返回無效大小,否則返回佈局的首選大小。

爲了讓您的窗口的實際大小,你應該使用QMainWindow.geometry()方法來代替,它提供了有關小部件的大小和位置的所有信息:

win_geo = self.geometry() 
win_top = win_geo.top() 
win_bottom = win_geo.bottom() 
win_left = win_geo.left() 
win_right = win_geo.right() 
win_width = win_geo.width() 
win_height = win_geo.height() 
+0

對於我對'sizeHint()'犯的錯誤,你確實是錯的。但正如我在我的回答中剛剛解釋的那樣:幾何圖形只適用於客戶區域,並且在移除碼頭時,框架區域不受影響。因此設置一個新的幾何體是不夠的,即使'adjustSize()'也不能改變幀的大小。如果你有任何改變框架大小的Qt解決方案,請讓我知道:) – Benjamin

相關問題