Python Emit()向另一个类发送信号是';行不通

Python Emit()向另一个类发送信号是';行不通,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我目前正在使用PyQt5开发GUI(在python和Qt方面我是一个noob),我需要从一个类向另一个类发出信号 我读了这篇文章,在谷歌上搜索了一下,也发现了很多有用的东西,但对我来说仍然不起作用 这是我的虚拟代码: 第1类: 导入系统 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 进口类别2 类别1(QWidget): eventButtonPressed=pyqtSignal(str) def uuu init uuu(self,parent=None): sup

我目前正在使用PyQt5开发GUI(在python和Qt方面我是一个noob),我需要从一个类向另一个类发出信号

我读了这篇文章,在谷歌上搜索了一下,也发现了很多有用的东西,但对我来说仍然不起作用

这是我的虚拟代码:

第1类:

导入系统 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 进口类别2 类别1(QWidget): eventButtonPressed=pyqtSignal(str) def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.Class1Btn=QPushButton('按钮') self.classedit=QLineEdit(self) self.Class1Btn.clicked.connect(self.clicked) #布局东西来模仿我的真实程序 self.Class1Grid=QGridLayout(self) self.classGrid.addWidget(self.Class1Btn) self.classGrid.addWidget(self.classEdit) self.groupBoxLayout1=QGroupBox(self) self.groupBoxLayout1.setLayout(self.classGrid) 已单击的定义(自我): self.eventButtonPressed.emit(self.classedit.text()) 第2类:

从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
进口类别1
类别2(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.Class1OBJ=Class1.Class1(self)
self.ClassObj.EventButton按下。连接(self.StuffWhenSignalisEmissed)
#布局东西来模仿我的真实程序
self.Class2Edit=QLineEdit(self)
self.Class2Grid=QGridLayout(self)
self.Class2Grid.addWidget(self.Class2Edit)
self.groupBoxLayout2=QGroupBox(self)
self.groupBoxLayout2.setLayout(self.Class2Grid)
发出信号时的def填充(自身,文本):
打印('class2小部件中的文本:{}'。格式(self.Class2Edit))
打印('class1小部件中的文本:{}'。格式(文本))
我的主窗口:

导入系统 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 进口类别1 进口类别2 类主窗口(QWidget、QApplication): 定义初始化(自): super()。\uuuu init\uuuuu() self.Class1OBJ=Class1.Class1() self.Class2OBJ=Class2.Class2() self.WinLayout=QVBoxLayout(self) self.WinLayout.addWidget(self.Class1OBJ.groupBoxLayout1) self.WinLayout.addWidget(self.Class2OBJ.groupBoxLayout2) self.setGeometry(1100300300300) self.setWindowTitle(“GUI”) self.show() app=QApplication(sys.argv) w=主窗口() w、 show() sys.exit(app.exec_()) 我希望程序在我按下按钮时打印StuffWhenSignalisEmissed方法中的语句(如果可能)。因此,我想打印第一类的LineEdit中的内容,以及第二类的LineEdit中的内容。

试试:

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class ClassTwo(QWidget):

    def __init__(self):
        super().__init__()
        self.classOneOBJ = ClassOne(self)                # + self
        self.classOneOBJ.eventButtonPressed.connect(self.StuffWhenSignalIsEmitted)

        layout = QGridLayout(self)
        layout.addWidget(self.classOneOBJ)

    def StuffWhenSignalIsEmitted(self, text):
        print('it worked ->{}'.format(text))
        # and do stuff with instance variables of an existing object

class ClassOne(QWidget):
    eventButtonPressed = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)

        self.lineEdit = QLineEdit() 

        self.Btn = QPushButton('Button')            
        self.Btn.clicked.connect(self.clicked)

        layout = QGridLayout(self)
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.Btn)

    def clicked(self):
        self.eventButtonPressed.emit(self.lineEdit.text())


if __name__ == '__main__':
     app = QApplication(sys.argv)
     main = ClassTwo()
     main.show()
     sys.exit(app.exec_())    
试试看:

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class ClassTwo(QWidget):

    def __init__(self):
        super().__init__()
        self.classOneOBJ = ClassOne(self)                # + self
        self.classOneOBJ.eventButtonPressed.connect(self.StuffWhenSignalIsEmitted)

        layout = QGridLayout(self)
        layout.addWidget(self.classOneOBJ)

    def StuffWhenSignalIsEmitted(self, text):
        print('it worked ->{}'.format(text))
        # and do stuff with instance variables of an existing object

class ClassOne(QWidget):
    eventButtonPressed = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)

        self.lineEdit = QLineEdit() 

        self.Btn = QPushButton('Button')            
        self.Btn.clicked.connect(self.clicked)

        layout = QGridLayout(self)
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.Btn)

    def clicked(self):
        self.eventButtonPressed.emit(self.lineEdit.text())


if __name__ == '__main__':
     app = QApplication(sys.argv)
     main = ClassTwo()
     main.show()
     sys.exit(app.exec_())    

您似乎认为,如果一个变量在不同的类中具有相同的名称,那么它就是同一个变量,因为它们不是,所以它们是不同的对象。Class2中的self.Class1OBJ与主窗口中的self.Class1OBJ不同

因此,解决方案只是创建一个self.Class1OBJ:

类别2.py

从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
类别2(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
#布局东西来模仿我的真实程序
self.Class2Edit=QLineEdit(self)
self.Class2Grid=QGridLayout(self)
self.Class2Grid.addWidget(self.Class2Edit)
self.groupBoxLayout2=QGroupBox(self)
self.groupBoxLayout2.setLayout(self.Class2Grid)
发出信号时的def填充(自身,文本):
打印('class2小部件中的文本:{}'。格式(self.Class2Edit))
打印('class1小部件中的文本:{}'。格式(文本))
main.py

导入系统 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 进口类别1 进口类别2 类主窗口(QWidget、QApplication): 定义初始化(自): super()。\uuuu init\uuuuu() self.Class1OBJ=Class1.Class1() self.Class2OBJ=Class2.Class2() #添加以下行 self.ClassObj.eventButtonPressed.connect(self.Class2OBJ.Stuff当信号发出时) self.WinLayout=QVBoxLayout(self) self.WinLayout.addWidget(self.Class1OBJ.groupBoxLayout1) self.WinLayout.addWidget(self.Class2OBJ.groupBoxLayout2) self.setGeometry(1100300300300) self.setWindowTitle(“GUI”) self.show() app=QApplication(sys.argv) w=主窗口() w、 show() sys.exit(app.exec_())
您似乎认为,如果一个变量在不同的类中具有相同的名称,那么它就是同一个变量,因为它们不是,所以它们是不同的对象。Class2中的self.Class1OBJ与主窗口中的self.Class1OBJ不同

因此,解决方案只是创建一个self.Class1OBJ:

类别2.py

从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
类别2(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
#布局东西来模仿我的真实程序
self.Class2Edit=QLineEdit(self)
self.Class2Grid=QGridLayout(self)
self.Class2Grid.addWidget(self.Class2Edit)
self.groupBoxLayout2=QGroupBox(self)
self.groupBoxLayout2.setLayout(self.Class2Grid)
发出信号时的def填充(自身,文本):
打印('class2小部件中的文本:{}'。格式(self.Class2Edit))
打印('class1小部件中的文本:{}'。格式(文本))
main.py

导入系统 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 进口类别1 进口类别2 类主窗口(QWidget、QApplication): 定义初始化(自): super()。\uuuu init\uuuuu() self.Class1OBJ=Class1.Class1() self.Class2OBJ=Class2.Class2() #添加以下行 self.ClassObj.eventButtonPressed.connect(self.Class2OBJ.Stuff当信号发出时) self.WinLayout=QVBoxLayout(self) self.WinLayout.addWidg