如何在QMainWindow的QVBoxLayout中让QFormLayout与GLViewWidget并排
问题分析与修复方案
你的代码核心问题是重复将同一个布局绑定到不同父容器,导致布局归属冲突,组件无法正常显示。具体来说:
- 你先把
params设置为group_box的布局,随后又将params直接添加到vertical_layout中。Qt中一个布局只能属于一个父组件/布局,第二次添加会导致group_box失去布局,同时params的结构被打乱,最终只显示部分组件。
另外还有两个小问题:
- 气压输入框用了
QIntValidator,但你输入的是浮点数,会导致无法输入小数,应该换成QDoubleValidator。 - 代码中重复创建了
only_integers变量,属于冗余写法。
以下是修复后的完整代码:
import sys import pyqtgraph.opengl as gl from PyQt6.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QHBoxLayout, QGroupBox, QFormLayout,\ QLabel, QLineEdit, QWidget from PyQt6.QtGui import QIntValidator, QDoubleValidator class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() first_view_widget = gl.GLViewWidget() second_view_widget = gl.GLViewWidget() third_view_widget = gl.GLViewWidget() central_widget = QWidget() vertical_layout = QVBoxLayout() central_widget.setLayout(vertical_layout) self.setCentralWidget(central_widget) # 底部两个并排的GL组件布局 horizontal_layout = QHBoxLayout() horizontal_layout.addWidget(first_view_widget) horizontal_layout.addWidget(second_view_widget) # 参数组框内的水平布局:表单 + 第三个GL组件 params_layout = QHBoxLayout() # 表单布局 f_layout = QFormLayout() # 第一行:整数输入 target_distance = QLabel('First row') distance_input = QLineEdit() distance_input.setText(str(100)) distance_input.setValidator(QIntValidator()) f_layout.addRow(target_distance, distance_input) # 第二行:浮点数输入 air_pressure = QLabel('Second row') pressure_input = QLineEdit() pressure_input.setText(str(1.01325)) pressure_input.setValidator(QDoubleValidator()) f_layout.addRow(air_pressure, pressure_input) params_layout.addLayout(f_layout) params_layout.addWidget(third_view_widget) # 组框绑定布局,并添加到垂直总布局 group_box = QGroupBox('Parameters') group_box.setLayout(params_layout) vertical_layout.addWidget(group_box) # 添加底部的水平GL布局 vertical_layout.addLayout(horizontal_layout) if __name__ == '__main__': app = QApplication(sys.argv) main = MainWindow() main.showMaximized() sys.exit(app.exec())
关键修改点:
- 移除了
vertical_layout.addLayout(params)这一行,确保params_layout只属于group_box,避免布局归属冲突。 - 将气压输入框的验证器改为
QDoubleValidator,适配浮点数输入需求。 - 优化变量命名(如
params改为params_layout),避免歧义,同时移除冗余的变量重复定义。
修改后,Parameters组框内会并排显示表单布局和第三个GL组件,下方则显示两个并排的GL组件,符合你的布局需求。
内容的提问来源于stack exchange,提问作者New2coding
相关产品推荐
相关产品推荐

