2012-04-20 129 views
1

我有一個PyQt 4應用程序,它有一個QMainWindow,在左側和底部停靠區中有停靠的QDockWidgets。我目前有兩個小部件停靠在左側,另外兩個停靠在底部。我試圖弄清楚如何以編程方式移動中央控件和停靠區域之間的邊界,有效地改變停靠區域的寬度(在左側或右側區域)或高度(對於頂部和底部停靠區域)。如何更改QDockWidgetArea中所有QDockWidgets的寬度/高度?

我可以用鼠標手動做到這一點;當我將光標移動到中心控件和停靠區域之間的邊界上時,我會得到一個調整大小的控件,可以用來伸展停靠區域。我還沒有找到一個界面來允許我從我的程序中執行此操作。我試過手動調整QDockWidget對象本身的大小(文檔建議不要)和它們包裝的小部件(應該可以工作),但這似乎不起作用。有任何想法嗎?

具體而言,這種方法是行不通的:

dock1.resize(QSize(width, height)) 
dock2.resize(QSize(width, height)) 
dock3.resize(QSize(width, height)) 

也沒有這樣的:

dock1.widget().resize(QSize(width, height)) 
dock2.widget().resize(QSize(width, height)) 
dock3.widget().resize(QSize(width, height)) 
+0

顯示你失敗的嘗試可能會提高你的答案的機會。 – Kleist 2012-04-20 21:38:06

+0

在'QDockWidget'裏面的'setMinimumSize'而不是''resize''怎麼樣?它工作嗎? – Avaris 2012-04-20 22:39:23

回答

5

我想我明白髮生了什麼。首先來自文檔的幾個筆記。

首先QMainWindow

的QMainWindow擁有自己的佈局,您可以添加QToolBars, QDockWidgets,一個QMenuBar和QStatusBar。該佈局有一箇中心 區域,可以被任何類型的小部件佔用。

A QMainWindow有自己的佈局管理器,這意味着它將管理其項目的佈局。我無法在文檔中找到任何參考,但我想佈局經理會嘗試最大化centralWidget的面積。因此所有其他元素都縮小到最小值。

讓我們看看QDockWidget

一個QDockWidget充當其子控件()的包裝,與 setWidget設置。自定義尺寸提示,最小尺寸和最大尺寸以及尺寸 策略應該在子部件中實施。 QDockWidget將 尊重他們,調整自己的約束以包含框架和標題。大小約束不應該在QDockWidget本身 上設置,因爲它們根據是否停靠而改變;停靠的 QDockWidget沒有框架和更小的標題欄。

所以這意味着你應該改變QDockWidget內的小部件的大小。當QDockWidget處於浮動狀態時,可隨意調整其窗口小部件的要求。但是停靠它會讓QMainWindow的佈局管理器縮小。

可能最簡單的解決方案是將minimumSize設置爲QDockWidget中的小部件,以便QMainWindow中的佈局管理器不會超出此限制。或者,您可以對小部件進行子類化並重新實現sizeHint方法,以便佈局管理器將獲得首選大小。

總之,這應該工作:

dock1.widget().setMinimumSize(QSize(width, height)) 
dock2.widget().setMinimumSize(QSize(width, height)) 
dock3.widget().setMinimumSize(QSize(width, height)) 
+0

工程很好。對於我的申請,我不一定要永久地製作新的尺寸棒;我只是想立即調整碼頭區域的寬度/高度。我發現使用'dock {x} .widget().setMinimumWidth(minWidth)'後跟'dock {x} .widget()。setMinimumWidth(oldMinWidth)'給了我想要的效果。 – 2012-04-23 21:05:03

+0

@JasonR:請記住,每次調整主窗口大小時,它都會回到'oldMinWidth'。 – Avaris 2012-04-23 21:54:49