PyQt5 调整选项卡到它的内容

PyQt5 resize tabs to its content

考虑这个例子。我想制作一个程序,其中主要 window 分为三个可以调整大小的部分。在中间我想有两个垂直放置的小部件,底部的一个是 QTabWidget,用户可以在其中更改某些属性。目前我只有一个选项卡和一个 属性 可以有更多。

我看到了类似的问题 (here and ),但我似乎无法理解与大小和布局相关的所有不同部分最初是如何协同工作的 + 它们是 C++ 问题。

请帮助我将 QTabWidget 调整为显示当前选项卡内容所需的最小尺寸。 作为旁注,您可以为 GUI 和 PyQt5 的初学者指出一些易于理解的文档。

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLineEdit, QLabel, QSplitter, QWidget, QListWidget, QApplication, QTabWidget, QGroupBox, \
    QFormLayout, QSizePolicy, QLayout
from PyQt5.QtCore import Qt


class Example(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.init_tabs()

        self.main_splitter = QSplitter(Qt.Horizontal)
        some_left_widget = QWidget()
        some_right_widget = QWidget()

        mid = QSplitter(Qt.Vertical)
        mid.addWidget(QListWidget())
        mid.addWidget(self.tabs)

        self.main_splitter.addWidget(some_left_widget)
        self.main_splitter.addWidget(mid)
        self.main_splitter.addWidget(some_right_widget)
        self.setCentralWidget(self.main_splitter)
        self.showMaximized()

    def init_tabs(self):
        self.properties_dict = {}
        self.properties_dict['Text'] = QLineEdit()

        self.tabs = QTabWidget()
        self.properties_groupbox = QGroupBox("Overview")

        layout = QFormLayout()
        for k, v in self.properties_dict.items():
            layout.addRow(QLabel(k + ':'), v)

        self.properties_groupbox.setLayout(layout)
        self.tabs.addTab(self.properties_groupbox, 'Properties')

        # I have no idea how these work
        self.properties_groupbox.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
        self.properties_groupbox.resize(self.properties_groupbox.minimumSizeHint())
        self.properties_groupbox.adjustSize()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

左一个是现在,右一个是想要的

QSplitter 使用复杂的计算来评估它分配给每个子窗口小部件的大小,尤其是在调整大小时(与任何其他窗口小部件一样,这在它首次显示时也会发生)。

它考虑的最重要的方面是小部件大小提示(小部件建议的最佳大小)和大小策略(如何调整小部件的大小以及如果有更多或更少的小部件将如何表现可用 space).

要实现您想要的效果,您需要设置大小策略 stretch(小部件将尝试在布局中使用 space 的比例使用)。

将小部件添加到拆分器后只需添加以下行:

    mid.setStretchFactor(0, 1)
    mid.setStretchFactor(1, 0)

第一行表示第一个小部件(列表)将使用 1 的拉伸因子,而第二个(选项卡小部件)将使用 0。拉伸因子是根据所有拉伸的总和计算的小部件的因素。
通过这种方式,列表将尝试占用最大可用 space(因为 1 是 1 + 0 的最大值),而选项卡最少。

请记住,拉伸因子还考虑了小部件的大小提示,因此如果您将 2 设置为列表并将 1 设置为选项卡,您将不会得到一个带有高度是标签的两倍。
此外,一旦调整拆分器大小时,将在调整拆分器大小时使用新比例,忽略先前设置的拉伸因子。