【问题标题】:PyQt5 resize tabs to its contentPyQt5 将选项卡的大小调整为其内容
【发布时间】:2019-12-27 12:24:59
【问题描述】:

考虑这个例子。我想制作一个程序,其中主窗口分为三个可以调整大小的部分。中间我想有两个垂直放置的小部件,底部的一个是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_())

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

【问题讨论】:

    标签: python pyqt5 qtabwidget


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢,这很有效,但是现在我很感兴趣,如果我突然想使用 QVBoxLayout 而不是 QSplitter 怎么办?那么小部件将如何表现以及如何实现相同的目标?我应该为此提出一个单独的问题吗?
    • stretch 参数也在addWidget() 方法中:layout.addWidget(listWidget, 1); layout.addWidget(tabWidget, 0)。或者,您可以将 horizontalvertical 拉伸设置为小部件的大小策略(只需从小部件中获取现有的,并在设置拉伸后重新应用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多