如何使用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)
关键修改说明
移除多余的QScrollArea
QTextEdit本身内置滚动功能,外层嵌套QScrollArea会导致大小控制逻辑冲突,双重滚动也会影响用户体验。直接给QTextEdit设置ScrollBarAlwaysOn即可实现滚动需求。精确控制QTextEdit高度
用fontMetrics().lineSpacing()获取当前字体的行高(含行间距),乘以3得到3行文本的总高度,设置为maximumHeight,确保组件不会超过这个高度,完美适配2-3行的显示需求。修正大小策略
- 水平方向用
Expanding:让QTextEdit占满分配的水平空间 - 垂直方向用
Maximum:限制组件高度不超过设置的最大值,同时允许在窗口缩小时自动缩小(但不会小于内容所需的最小高度)
- 水平方向用
设置QSplitter拉伸因子
给主垂直分割器设置setStretchFactor(0,10)和setStretchFactor(1,1),让画布区域占据10倍于底部消息区域的空间,彻底解决底部区域占比过大的问题。
内容的提问来源于stack exchange,提问作者nospec
相关产品推荐
相关产品推荐

