首页 > 解决方案 > PyQt5 将选项卡的大小调整为其内容

问题描述

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

我看到了类似的问题(herehere),但我似乎无法理解与大小和布局相关的所有不同部分是如何一起工作的+它们是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_())

左边是现在,右边是想要的

现在 期望的

标签: pythonpyqt5qtabwidget

解决方案


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

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

为了达到您想要的效果,您需要设置尺寸策略拉伸(这是小部件将尝试使用的布局中可用空间的比例)。

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

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

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

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


推荐阅读