You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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())

关键修改点:

  1. 移除了vertical_layout.addLayout(params)这一行,确保params_layout只属于group_box,避免布局归属冲突。
  2. 将气压输入框的验证器改为QDoubleValidator,适配浮点数输入需求。
  3. 优化变量命名(如params改为params_layout),避免歧义,同时移除冗余的变量重复定义。

修改后,Parameters组框内会并排显示表单布局和第三个GL组件,下方则显示两个并排的GL组件,符合你的布局需求。

内容的提问来源于stack exchange,提问作者New2coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:12:42