PyQt5技术问题:如何将PlotWidget置于按钮下方而非后方
布局调整方案
问题根源是你混合使用了布局管理器和绝对定位(setGeometry),导致PlotWidget被绝对定位的按钮覆盖。要解决这个问题,需要统一使用布局管理器规划所有控件位置,以下是调整后的代码:
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.resize(1710, 650) MainWindow.setWindowTitle('StarBot') self.centralwidget = QWidget() self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) # 主布局:左右分栏 main_layout = QHBoxLayout(self.centralwidget) main_layout.setSpacing(20) main_layout.setContentsMargins(20, 30, 20, 20) # 左侧区域布局 left_layout = QVBoxLayout() left_layout.setSpacing(20) # 顶部按钮与portfolio_value的横向布局 top_bar_layout = QHBoxLayout() top_bar_layout.setSpacing(10) self.pushButton = QPushButton() self.pushButton.setFixedSize(150, 41) self.pushButton.setObjectName("pushButton") self.pushButton.setStyleSheet( '''background-color: #202025; border-width: 1px; border-style: solid; border-color: #202025;''') self.pushButton.setText('START') top_bar_layout.addWidget(self.pushButton) self.portfolio_value = QPlainTextEdit() self.portfolio_value.setFixedHeight(41) self.portfolio_value.setObjectName("portfolio_value") self.portfolio_value.setStyleSheet( '''background-color: #202025; border-width: 1px; border-style: solid; border-color: #202025;''') top_bar_layout.addWidget(self.portfolio_value) left_layout.addLayout(top_bar_layout) # 添加PlotWidget到左侧布局,位于按钮下方 self.plot_widget = pg.PlotWidget() left_layout.addWidget(self.plot_widget) # 添加output控件 self.output = QPlainTextEdit() self.output.setFixedHeight(91) self.output.setObjectName("output") self.output.setStyleSheet(custom_style) left_layout.addWidget(self.output) # 右侧historical_data self.historical_data = QPlainTextEdit() self.historical_data.setObjectName("historical_data") self.historical_data.setStyleSheet(custom_style) self.historical_data.setPlainText(text) main_layout.addWidget(self.historical_data, stretch=1) # 将左侧布局加入主布局 main_layout.addLayout(left_layout, stretch=1) MainWindow.setStyleSheet( '''background-color: #252526; border-width: 1px; border-style: solid;''') QtCore.QMetaObject.connectSlotsByName(MainWindow) if __name__ == "__main__": import sys import pyqtgraph as pg from PyQt5 import QtCore, QtWidgets custom_style = """/* 补充你原有的custom_style样式定义 */""" text = """/* 补充你原有的text文本内容 */""" app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
关键改动说明:
- 移除所有
setGeometry调用,改用布局管理器自动控制控件位置与大小 - 用
QHBoxLayout作为主布局,将界面分为左右两栏 - 左侧用
QVBoxLayout垂直排列控件:顶部横向布局(按钮+portfolio_value)→ PlotWidget → output - 通过
stretch参数控制左右栏宽度比例,用fixedSize/fixedHeight保留原控件尺寸设定 - 所有控件均通过布局管理器添加,彻底解决层级覆盖问题
内容的提问来源于stack exchange,提问作者ms mavie
相关产品推荐
相关产品推荐

