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

如何使用QSizePolicy固定QVBoxLayout中QTextEdit的高度?

解决QTextEdit占据过多窗口空间的问题

问题核心

你的QTextEdit之所以占了近半个窗口,主要是QSplitter未设置合理拉伸因子、多余的QScrollArea导致大小控制失效,以及QTextEdit未限制最大高度这三个原因共同造成的。下面是针对性的修改方案:


修改后的完整UI代码片段

def UI(self):
    # UI LAYOUT
    central_widget = QWidget()
    self.setCentralWidget(central_widget)

    # 直接使用QTextEdit自带滚动功能,移除多余的QScrollArea
    self.console_out = QTextEdit(self)
    self.console_out.setReadOnly(True)
    self.console_out.setPlaceholderText('Plugin Ready!')
    # 始终显示垂直滚动条
    self.console_out.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    
    # 计算2-3行文本的高度,适配不同字体大小
    line_height = self.console_out.fontMetrics().lineSpacing()
    # 设置最大高度为3行(含行间距),确保仅显示2-3行内容
    self.console_out.setMaximumHeight(line_height * 3)
    
    # 设置大小策略:水平方向占满空间,垂直方向不超过最大高度
    self.console_out.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)

    main_layout = QVBoxLayout(central_widget)

    # NORTH STAR(代码保持不变)
    ico = QPixmap(cwd + "/ico/north.png")
    self.na = QGraphicsPixmapItem(ico)
    self.na.setTransform(QTransform.fromScale(0.1, 0.1), True)
    self.na.setTransformOriginPoint(self.na.boundingRect().center())
    self.canvas.scene().addItem(self.na)
    self.canvas.scene().update()

    # ROTATION(代码保持不变)
    self.rot = QSpinBox(self)
    self.rot.setRange(0, 360)
    self.rot.setSuffix(" °")
    self.rot.valueChanged.connect(self.rotateMapCanvas)

    # 底部水平分割器:直接添加QTextEdit(不再用ScrollArea包裹)
    self.bottom_split = QSplitter(Qt.Horizontal)
    self.bottom_split.addWidget(self.console_out)
    self.bottom_split.addWidget(self.rot)
    self.bottom_split.setStretchFactor(0, 10)  # 让消息区域占更多水平空间

    # 主垂直分割器:设置拉伸因子,让画布占绝大多数窗口空间
    main_split = QSplitter(Qt.Vertical)
    main_split.addWidget(self.canvas)
    main_split.addWidget(self.bottom_split)
    main_split.setStretchFactor(0, 10)  # 画布占10份
    main_split.setStretchFactor(1, 1)   # 底部区域占1份

    main_layout.addWidget(main_split)

关键修改说明

  1. 移除多余的QScrollArea
    QTextEdit本身内置滚动功能,外层嵌套QScrollArea会导致大小控制逻辑冲突,双重滚动也会影响用户体验。直接给QTextEdit设置ScrollBarAlwaysOn即可实现滚动需求。

  2. 精确控制QTextEdit高度
    用fontMetrics().lineSpacing()获取当前字体的行高(含行间距),乘以3得到3行文本的总高度,设置为maximumHeight,确保组件不会超过这个高度,完美适配2-3行的显示需求。

  3. 修正大小策略

    • 水平方向用Expanding:让QTextEdit占满分配的水平空间
    • 垂直方向用Maximum:限制组件高度不超过设置的最大值,同时允许在窗口缩小时自动缩小(但不会小于内容所需的最小高度)
  4. 设置QSplitter拉伸因子
    给主垂直分割器设置setStretchFactor(0,10)和setStretchFactor(1,1),让画布区域占据10倍于底部消息区域的空间,彻底解决底部区域占比过大的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:00:37