2017-12-27 1715 views
1

我有一個QTreeView裏面的QSplitter,我想設置的初始大小。我發現我可以在QTreeView上設置setMinimumWidth(val)setFixedWidth(val),但這兩個都不符合我的需要。如何在QSplitter中設置QTreeView的初始大小?

setMinimumWidth(val)僅防止QTreeView從獲得比的val值越小,並且setFixedWidth防止用戶調整大小QTreeView完全。

是否有無論如何設置初始尺寸,通過設置QSplitter或設置QTreeView?我假設我需要設置sizeHint,但我不太確定。

我使用Python 3 PyQt5

回答

1

您可以重新實現sizeHint設置初始大小:

class TreeView(QtWidgets.QTreeView): 
    def sizeHint(self): 
     size = super().sizeHint() 
     size.setWidth(320) 
     return size 

但是,如果創建一個子類是不可取的,而且你不介意的設置一個比例初始大小,你可以使用QSplitter.setSizes。 Qt文檔以這種方式定義了此方法的行爲:

拆分器小部件的整體大小不受影響。相反,任何 附加/缺失空間在根據 分配到小部件的相對權重。 [着重點]

所以,如果總和的尺寸大於分配器並不重要,所有重要的是相對權重。鑑於此,我們就可以計算最大可能的大小可用,然後相應地劃分它,就像這樣:

width = QtWidgets.qApp.desktop().availableGeometry(self).width() 
self.splitter.setSizes([width * 2/3, width * 1/3]) 

這將使得第一小兩倍第二。

除了這些方法之外,您還可以使用QSplitter.saveStateQSplitter.restoreState來保存和恢復用戶從以前的會話中設置的拆分器大小。

PS

如果您使用Qt設計,上面sizeHint方法可以用插件推廣,這是實現非常簡單使用。有關如何執行此操作的說明,請參閱this answer

+0

我真的很驚訝'sizeHint()'還沒有在一個更直接的莊園裏實現,比如'setSizeHint(width,height)'或者那個效果。我在Qt Creator中做了佈局,所以子類化是不可取的,我知道我不能直接在'QTreeView'上使用'setWidth(val)',但是如果我正在尋找準確的尺寸。 –

+0

@AaronTomason。您可以使用窗口小部件升級 - 請參閱我的答案更新。 – ekhumoro

+0

我想我會給小部件的推廣一個旋轉。感謝更新! –