如何实现 QPushbutton 来发出 pyqt 信号并调用另一个 class?

How to implement a QPushbutton to emit pyqt signal and call another class?

我正在尝试学习 emitting/receiving 信号的基本用法,但 运行 遇到了一些麻烦。

我想从一些基本的东西开始,所以我创建了一个 MainWindow 并放置了一个名为 "plot" 的 QPushButton。

按下按钮时,它接受参数(self、xdata、ydata)并从我的 class MainWindow(QMainWindow)

运行方法 initiatePlot
    self.plotbtn = QPushButton("Plot")
    self.plotbtn.clicked.connect(partial(self.initiatePlot, xdata, ydata))

    def initiatePlot(self,x,y):
        PlotSignal = pyqtSignal(list, list)
        self.PlotSignal.emit(x, y)

之后我尝试将它连接到我的绘图仪 class,但我只是得到 "Process finished exit code 1" 我相信错误来自我下面的这行特定代码 class .

self.PlotSignal.connect(self.plotData)

绘图仪代码CLASS

class createFIG(FigureCanvas):
  def __init__(self):
    #super().__init__(Figure(tight_layout=True))
    self.figure = plt.figure()
    self.axes = self.figure.add_subplot(111)

    self.name = ""

    # xdata = [1,2,3,4,5]
    # ydata = [12,4,56,78,9]

    plt.figure()
    self.axes.set_xlabel('x label')

    #self.plotData(xdata,ydata)

    self.PlotSignal.connect(self.plotData)


  def plotData(self, xdata,ydata):
    print("plotting")
    self.axes.plot(xdata, ydata)
    self.draw()
    plt.show()

抱歉,空格可能有点乱。

当前的问题是我如何接收从 initiatePlot 方法发出的信号。

最终目标是每次都能够单击绘图按钮并使用新的绘图创建一个新的 window。

如果有更简单的方法来 link 我的 mainwindow 中的按钮来绘制 class 那会很有帮助。

这是我的完整代码的 link:https://github.com/Silvuurleaf/InteractiveGraphing/blob/master/LiveGraphing.py

如前所述,我不确定这是否真的是您要查找的内容,但每次按下按钮时,以下代码应该会创建一个新的 matplotlib window。

import sys
#Importing PyQt5 library to construct widgets for Graphic User Interface (GUI) application
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import (QLineEdit, QPushButton, QSlider, QApplication, QVBoxLayout, QHBoxLayout,
                             QWidget, QLabel, QCheckBox, QRadioButton, QPlainTextEdit, QSizePolicy,
                             QMainWindow,QFrame, QFileDialog, QTableWidgetItem, QTableWidget, QMenu, QMessageBox,
                             QAction, QToolBar)
from PyQt5.QtCore import Qt, QAbstractTableModel, pyqtSignal

from functools import partial
import matplotlib
matplotlib.use("Qt5Agg")

from matplotlib import pyplot as plt
plt.style.use(['ggplot'])

class createFIG():
    def __init__(self):
        self.figure = plt.figure()
        self.axes = self.figure.add_subplot(111)
        self.name = ""
        self.axes.set_xlabel('x label')

    def plotData(self, xdata,ydata):
        print("plotting")
        self.axes.plot(xdata, ydata)
        plt.show()


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("Perspective")

        self.initializeUI()

    def initializeUI(self):

        xdata = [1,2,3,4,5]
        ydata = [12,4,56,78,9]

        #Main Widget
        self.main_widget = QWidget(self)
        self.setCentralWidget(self.main_widget)

        self.plotbtn = QPushButton("Plot")
        self.plotbtn.clicked.connect(partial(self.initiatePlot, xdata, ydata))

        self.hMAIN = QHBoxLayout(self.main_widget)
        self.vboxLeft = QVBoxLayout()
        self.vboxLeft.addWidget(self.plotbtn)

        self.hbox1 = QHBoxLayout()

        self.vboxLeft.addLayout(self.hbox1)

        self.PlotLayout = QVBoxLayout()

        self.hMAIN.addLayout(self.vboxLeft)
        self.hMAIN.addLayout(self.PlotLayout)

        self.show()

    def initiatePlot(self,x,y):
        print("emit signal")
        f = createFIG()
        f.plotData(x, y)


def main():
        # main loop
        app = QApplication(sys.argv)
        # instance
        window = MainWindow()
        window.show()
        # appWindow = MainWindow()
        sys.exit(app.exec_())

if __name__ == "__main__":
    main()