PyQt实例间Signal Slots连接:SymbolPlotter点击信号传递到MainWindow状态栏
PyQt跨组件信号槽连接实现方案
核心逻辑:子组件自定义信号并触发,父组件绑定信号到自身槽函数,避免循环导入和紧耦合问题。
第一步:修改SymbolPlotter.py
- 移除对
main.py的MainWindow导入,避免循环导入 - 在
SymbolPlotterClass类内定义带字符串参数的自定义信号 - 按钮点击触发内部槽函数,发射携带消息的信号
修改后完整代码:
import sys from PyQt5 import QtWidgets as qtw from PyQt5 import QtGui as qtg from PyQt5 import QtCore as qtc from PyQt5 import QtChart as qtch import Stylesheet as st class SymbolPlotterClass(qtw.QWidget): # 自定义信号:携带字符串类型的消息 status_msg_signal = qtc.pyqtSignal(str) def __init__(self, symbol): super().__init__() # 创建按钮 button0 = qtw.QPushButton("Select Folder", self) button0.setStyleSheet(st.b1) # 绑定按钮点击到内部槽函数 button0.clicked.connect(self.onPressed_btn0) # chart对象和 viewer chart = qtch.QChart() chartview = qtw.QChartView(chart) # 布局设置 layout = qtw.QVBoxLayout() self.setLayout(layout) layout.addWidget(chartview) sublayout = qtw.QHBoxLayout() layout.addLayout(sublayout) sublayout.addWidget(button0) # 按钮点击槽函数:发射信号 def onPressed_btn0(self): message = 'select folder pressed' self.status_msg_signal.emit(message) if __name__ == '__main__': pass
第二步:修改main.py
- 修复原有两个逻辑bug:
- 将局部变量
status_bar改为实例属性self.status_bar,方便类内其他方法调用 UpdateStatusBarMessage方法中移除showMessage参数的引号,否则会固定显示字符串"message"
- 将局部变量
- 实例化
SymbolPlotterClass后,将其自定义信号绑定到主窗口的UpdateStatusBarMessage槽函数
修改后完整代码:
import sys from PyQt5 import QtWidgets as qtw import SymbolPlotter as sp import Stylesheet as st # 注意导入你自己的DatabaseStorage模块,原代码漏了 import DatabaseStorage as dbs class MainWindow(qtw.QMainWindow): def __init__(self, symbol, speed='1d1s'): super().__init__() # 1. 创建标签页组件 tabs = qtw.QTabWidget(tabShape='triangular') tabs.setStyleSheet(st.TabBar) self.setCentralWidget(tabs) # 创建状态栏,设为实例属性 self.status_bar = qtw.QStatusBar() self.setStatusBar(self.status_bar) self.status_bar.showMessage('Ready') # 1 数据实时绘图标签页 self.SymbolPlotter = sp.SymbolPlotterClass(symbol) tabs.addTab(self.SymbolPlotter, f'Online Plotter: {symbol}') # 绑定子组件信号到主窗口状态栏更新槽函数 self.SymbolPlotter.status_msg_signal.connect(self.UpdateStatusBarMessage) # 3 数据存储标签页 DBStorage = dbs.DatabaseStorageClass() tabs.addTab(DBStorage, 'Database Storage') # UI初始化完成 self.show() def UpdateStatusBarMessage(self, message='empty'): # 移除参数的引号,使用传入的message变量 self.status_bar.showMessage(message) if __name__ == '__main__': app = qtw.QApplication(sys.argv) # 这里symbol参数你自己替换成实际值 symbol = "测试标的" mw = MainWindow(symbol, speed='1d10ms') mw.setWindowTitle('Test') windows_style = qtw.QStyleFactory.create('Fusion') app.setStyle(windows_style) sys.exit(app.exec())
原有代码问题说明
- 直接导入
MainWindow类调用方法,实际需要调用的是主窗口实例的方法,类调用无法生效 - 双向导入会触发循环导入错误,程序无法运行
- 状态栏未设为实例属性,
UpdateStatusBarMessage无法访问到状态栏对象 showMessage参数加引号导致逻辑错误,永远显示固定文本
内容的提问来源于stack exchange,提问作者chubaka
相关产品推荐
相关产品推荐

