我正在使用 pyqt5 开发一个 GUI 应用程序。在某个对话框中,我需要许多组件,其中一个是 QWebEngineView 作为绘制数据的画布,即使在创建对话框时图表还没有准备好,它也应该占用大部分可用空间。
我调查并发现了拉伸因子。我看到 QSizePolicy 仅直接适用于小部件而不适用于布局,如this SO answer所示。但后来我看到 addWidget 和 addLayout 方法允许我在 QBoxLayout 的方向上设置拉伸因子,这对我的意图来说似乎很理想。
所以我尝试了:
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QHBoxLayout
from strategy_table import StrategyTable
layout = QVBoxLayout()
layout.addWidget(QLabel("Strategy components"))
# Upper layout for a table. Using a 30% of vertical space
upper_layout = QHBoxLayout() # I'm using a HBox because I also want a small button at the right side of the table
self.table = StrategyTable(self) # Own class derived from QTableWidget
upper_layout.addWidget(self.table)
add_button = QPushButton('Add')
add_button.clicked.connect(self._show_add_dialog)
upper_layout.addWidget(add_button)
layout.addLayout(upper_layout, 3) # Setting 20% of size with the stretch factor
# Then the plot area, using 60% of vertical space
layout.addWidget(QLabel("Plot area"))
canvas = QWebEngineView()
layout.addWidget(self.canvas, 6)
# Finally, a small are of 10% of vertical size to show numerical results
layout.addWidget(QLabel("Results"))
params_layout = self._create_results_labels() # A column with several QLabel-QTextArea pairs, returned as a QHBoxLayout
layout.addLayout(params_layout, 1)
self.setLayout(layout)
在底部添加结果布局之前看起来还不错,我猜是因为上面的表格一开始是空的,因此占用的空间很小,其余的都留给了画布。
无论如何,似乎拉伸因子被忽略了,所以我不知道我是否在这里遗漏了什么,或者我没有完全理解拉伸因子。
顺便说一句,我知道我会使用 QtEditor 来设计 GUI,但我更喜欢手动做这些事情。