python - PyQt5 将选项卡的大小调整为其内容
问题描述
考虑这个例子。我想制作一个程序,其中主窗口分为三个可以调整大小的部分。中间我想有两个垂直放置的小部件,底部的一个是QTabWidget,用户可以在其中更改某些属性。目前我只有一个选项卡和一个属性,还可以有更多。
我看到了类似的问题(here和here),但我似乎无法理解与大小和布局相关的所有不同部分是如何一起工作的+它们是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 使用复杂的计算来评估它分配给每个子窗口小部件的大小,尤其是在调整大小时(这与任何其他窗口小部件一样,在它首次显示时也会发生)。
它考虑的最重要的方面是小部件的大小提示(小部件建议它是更可取的大小)和大小策略(小部件如何调整大小以及如果有更多或更少的可用空间它将如何表现)。
为了达到您想要的效果,您需要设置尺寸策略拉伸(这是小部件将尝试使用的布局中可用空间的比例)。
只需在将小部件添加到拆分器后添加以下行:
mid.setStretchFactor(0, 1)
mid.setStretchFactor(1, 0)
第一行表示第一个小部件(列表)将使用 1 的拉伸因子,而第二个(选项卡小部件)将使用 0。拉伸因子是根据小部件的所有拉伸因子的总和计算的。
这样,列表将尝试占用最大可用空间(因为 1 是 1 + 0 的最大值),而选项卡最少。
请记住,拉伸因子还考虑了小部件的大小提示,因此如果将列表设置为 2,将选项卡设置为 1,您将不会得到一个高度是选项卡高度两倍的列表。
此外,一旦调整了拆分器的大小,将在调整拆分器的大小时使用新的比例,而忽略先前设置的拉伸因子。
推荐阅读
- command-line-interface - 多字命令行参数的样式指南规则?
- arrays - 在 bash shell 中使用输出文件中的数组
- python - 与 Tensorflow 中的常规 LSTMCell 相比,使用 CudnnLSTM 进行训练时的结果不同
- python-3.x - 将 Python 模块导入 Sublime Text 3
- .net - Select.Pdf:安全透明方法访问安全关键方法
- ios - NVActivityIndicatorView 在按下按钮时不起作用
- javascript - 自动保存包含多个项目的 PHP 表单并使用 ajax 保存在 mysqli 中
- azure - Web API 和 Azure 移动应用程序,我应该将它们分开吗?
- ios - 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,此类不符合键操作的键值编码
- c# - 限制 Form 的启动行为