Python Emit()向另一个类发送信号是';行不通
我目前正在使用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类: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.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