如何在不同类中使用Slot+Signal?
How to use Slot+Signal in different classes?
我必须说这是一个非常初学者的问题。我已经阅读并尝试了很多,但仍然不明白 Slot+Signal
是如何工作的。
在我的以下代码中,我想在单击按钮时将三个变量从 MyApp Class 传输到 Worker Class。
代码无效。
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Worker(QObject):
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
@pyqtSlot(str, str, int)
def onJob(self, strA, strB, int1):
print(strA, strB, int1)
for i in range(40):
print(i)
class MyApp(QWidget):
def __init__(self, parent= None):
super(MyApp, self).__init__(parent)
self.initUI()
def initUI(self):
self.btn = QPushButton("start", self)
self.btn.clicked.connect(self.start)
self.show()
def start(self):
otherClass = Worker()
self.signal = pyqtSignal(str, str, int)
self.signal.emit("foo", "baz", 10)
self.signal.connect(otherClass.onJob)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
您的代码存在以下错误:
信号不能在class的任何方法中声明,它必须与方法处于同一级别。
如果我在将信号连接到任何插槽之前发送信号,那么没有人会收听该信息,因此数据将丢失,即数据传输几乎是瞬时的。
在下面的代码中,我已经实施了必要的修改以使其工作:
class MyApp(QWidget):
signal = pyqtSignal(str, str, int)
def __init__(self, parent= None):
super(MyApp, self).__init__(parent)
self.initUI()
def initUI(self):
self.btn = QPushButton("start", self)
self.btn.clicked.connect(self.start)
self.show()
def start(self):
otherClass = Worker()
self.signal.connect(otherClass.onJob)
self.signal.emit("foo", "baz", 10)
我必须说这是一个非常初学者的问题。我已经阅读并尝试了很多,但仍然不明白 Slot+Signal
是如何工作的。
在我的以下代码中,我想在单击按钮时将三个变量从 MyApp Class 传输到 Worker Class。
代码无效。
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Worker(QObject):
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
@pyqtSlot(str, str, int)
def onJob(self, strA, strB, int1):
print(strA, strB, int1)
for i in range(40):
print(i)
class MyApp(QWidget):
def __init__(self, parent= None):
super(MyApp, self).__init__(parent)
self.initUI()
def initUI(self):
self.btn = QPushButton("start", self)
self.btn.clicked.connect(self.start)
self.show()
def start(self):
otherClass = Worker()
self.signal = pyqtSignal(str, str, int)
self.signal.emit("foo", "baz", 10)
self.signal.connect(otherClass.onJob)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
您的代码存在以下错误:
信号不能在class的任何方法中声明,它必须与方法处于同一级别。
如果我在将信号连接到任何插槽之前发送信号,那么没有人会收听该信息,因此数据将丢失,即数据传输几乎是瞬时的。
在下面的代码中,我已经实施了必要的修改以使其工作:
class MyApp(QWidget):
signal = pyqtSignal(str, str, int)
def __init__(self, parent= None):
super(MyApp, self).__init__(parent)
self.initUI()
def initUI(self):
self.btn = QPushButton("start", self)
self.btn.clicked.connect(self.start)
self.show()
def start(self):
otherClass = Worker()
self.signal.connect(otherClass.onJob)
self.signal.emit("foo", "baz", 10)