【发布时间】:2021-10-10 11:49:12
【问题描述】:
所以我目前正在开发一个 PyQT5 GUI,我已经坚持了好几个小时。
我想要signal1 连接到slot3,但什么也没发生。我真的很困惑。为什么连接不上slot3?
import sys
from PyQt5 import QtCore as core
from PyQt5 import QtWidgets as widget
class MainApp(widget.QApplication):
def __init__(self, argv):
widget.QApplication.__init__(self, argv)
self.window1 = Window1()
self.window2 = Window2()
self.window1.signal1.connect(self.window2.slot3)
class Window1(widget.QMainWindow):
signal1 = core.pyqtSignal()
signal2 = core.pyqtSignal()
def __init__(self):
widget.QMainWindow.__init__(self)
self.slot1()
self.show()
def slot1(self):
self.signal1.emit()
print('slot1 connected')
def slot2(self):
print('slot2 connected')
class Window2(widget.QMainWindow):
signal3 = core.pyqtSignal()
signal4 = core.pyqtSignal()
def __init__(self):
widget.QMainWindow.__init__(self)
self.show()
def slot3(self):
print('slot3 connected')
def slot4(self):
print('slot4 connected')
if __name__ == '__main__':
app = MainApp(sys.argv)
sys.exit(app.exec_())
【问题讨论】:
-
它按预期工作,在您创建 Window2 的实例之前发出信号,因此您看不到“slot3 connected”。你也许可以使用
QTimer.singleShot(1, lambda: self.signal1.emit())。 -
我已经尝试过您的解决方案,它确实有效。谢谢!
-
我认为问题在于您试图在 GUI 循环之前发出。这可能不是因为你创建了 window2 之后。
-
是的,这是因为连接是在实例创建之后完成的,它也负责发出信号。在极少数情况下,类会在
__init__中发出内部信号,这是因为显然该信号只能在 初始化之后连接。由于示例的代码非常抽象,因此除了使用计时器之外,很难提供适当的 解决方案。除此之外,所有slot函数都应该打印“slot called”,而不是“connected”:slot 在信号发出时执行,而不是在连接时执行。 -
感谢您的 cmets。因为在“slot1”中,我有一些条件需要检查。如果该条件为真,它将连接到“slot3”,并且需要在主 GUI 启动后立即检查该条件。那么我应该如何归档呢?
标签: python python-3.x pyqt pyqt5