【问题标题】:PyQt Signal Slots conection between instances实例之间的 PyQt Signal Slots 连接
【发布时间】:2021-10-03 07:46:47
【问题描述】:

如何将 SymbolPlotter 中的按钮点击信号发送到 MainWindow 的状态栏并附加新消息?

所以基本上当我单击模块符号绘图仪中的按钮时,我想在主状态栏中显示一个文本。类 MainWindow 中的 Py

main.py:


import sys
from PyQt5 import QtWidgets as qtw

import SymbolPlotter as sp
import Stylesheet as st


class MainWindow(qtw.QMainWindow):

    def __init__(self, speed='1d1s'):
        super().__init__()
        
        # 1. create a tab widget in mainwindow
        tabs = qtw.QTabWidget(tabShape='triangular')
        tabs.setStyleSheet(st.TabBar)
        self.setCentralWidget(tabs)


        # create a status bar
        status_bar = qtw.QStatusBar()
        self.setStatusBar(status_bar)
        status_bar.showMessage('Ready')


        #1 tab to plot data in streaming fashion
        SymbolPlotter = sp.SymbolPlotterClass(symbol)  
        tabs.addTab(SymbolPlotter, f'Online Plotter: {symbol}')  


        #3 tab to save/update downloaded data to database
        DBStorage = dbs.DatabaseStorageClass()
        tabs.addTab(DBStorage, 'Database Storage')



        # End main UI code
        self.show()


    def UpdateStatusBarMessage(self, message='empty'):
        self.status_bar.showMessage('message')



if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    
    mw = MainWindow(symbol,speed='1d10ms')
    mw.setWindowTitle('Test')
    windows_style = qtw.QStyleFactory.create('Fusion')  
    app.setStyle(windows_style)
    sys.exit(app.exec())


在 SymbolPlotter 中,发出信号

SymbolPlotter.py

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

from main import MainWindow as mw


import Stylesheet as st



class SymbolPlotterClass(qtw.QWidget):  
    def __init__(self, symbol):
        super().__init__()

       
        # create buttons
        button0 = qtw.QPushButton("Select Folder", self)  
        button0.setStyleSheet(st.b1) 
        
        #self.button0.clicked.connect(self.onPressed_btn0)
        button0.clicked.connect(lambda: mw.UpdateStatusBarMessage('test message'))

        
        # chart object and viewer 
        chart = qtch.QChart()  
        chartview = qtch.QChartView(chart)


        
        # create vertical layout object for page
        layout = qtw.QVBoxLayout()
        self.setLayout(layout)
        # add a horizontal sublayout
        layout.addWidget(chartview)

        sublayout = qtw.QHBoxLayout()
        layout.addLayout(sublayout)
        # add widgets to layout
        sublayout.addWidget(button0)
        

            

    # emit signal
    def onPressed_btn0(self):
        message = 'select folder pressed'
        #mw.UpdateStatusBarMessage()
        #self.submitted.emit()
        



if __name__ == '__main__':
    pass

【问题讨论】:

    标签: python pyqt5 signals-slots


    【解决方案1】:

    根据音乐评论,修改为正确的解决方案:

    在 SymbolPlotter.py 模块中:

    class SymbolPlotterClass(qtw.QWidget):  
    
        #A) create a signal outside init
        msgSignal = qtc.pyqtSignal(str)
    
        def __init__(self, symbol, time_iterator, message):
            super().__init__()
    
            ...
    
    
            # create button
            button0 = qtw.QPushButton("Select Folder", self)
            
            # connect 'button click' event to a methode
            button0.clicked.connect(self.onPressed_btn0)
    
            # add button to layout
            layout = qtw.QVBoxLayout()
            self.setLayout(layout)
            # add a horizontal sublayout
            layout.addWidget(button0)
    
    
        # emit signal in methode
        def onPressed_btn0(self):
            msg = 'button0 clicked'
            self.msgSignal.emit(msg)
                
    

    在 main.py 中:

    class MainWindow(qtw.QMainWindow):
    
        def __init__(self, symbol, folder='Desktop'):
            """MainWindow constructor. """
            super().__init__()
            
            ...
    
            # create a status bar
            status_bar = qtw.QStatusBar()
            self.setStatusBar(status_bar)
            status_bar.showMessage('Ready')
    
    
            # create the Plotter object 
            SymbolPlotter = sp.SymbolPlotterClass(symbol)  
    
            # connect the Signal from #A to the Slot/Function
            SymbolPlotter.msgSignal.connect(status_bar.showMessage)  
    
            # add tab to mainwindow
            tabs.addTab(SymbolPlotter, f'Online Plotter: {symbol}')
    
    
    我找到了一个解决方案,我将帖子留给需要它的人,即使我不知道我的解决方案是否正确,但它有效:

    在 main.py 我传递状态栏对象:

    #1 tab to plot data in streaming fashion
    SymbolPlotter = sp.SymbolPlotterClass(symbol, status_bar)  
    tabs.addTab(SymbolPlotter, f'Online Plotter: {symbol}') 
    
    

    在 SymbolPlotter 中我使用它: 符号绘图仪.py

    class SymbolPlotterClass(qtw.QWidget):  
        def __init__(self, symbol, status_bar):
            super().__init__()
    
            self.status_bar = status_bar
    
    
            button0 = qtw.QPushButton("Select Folder", self);  
            button0.clicked.connect(self.onPressed_btn0)
    
    
        def onPressed_btn0(self):
            message = 'select folder pressed'
            self.status_bar.showMessage(message)
    
    

    【讨论】:

    • 信号不应该这样使用。为 SymbolPlotterClass 创建一个自定义信号并在onPresssed_btn0 中发出它,然后从主窗口连接该信号:SymbolPlotter.mySignal.connect(self.status_bar.showMessage)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2016-07-22
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多