如果在连接信号之前调用 Slot,则无法连接到 QTimer Slot 中发送的信号
Unable to connect to a Signal sent in a QTimer Slot if Slot is called before connecting the signal
Py3/PySide2 5.13.2 Windows
我有两个 类:一个时钟用计时器发出信号/一个显示器打印时间
import PySide2
from PySide2 import QtCore, QtWidgets, QtGui
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import Signal, Slot
import time
import sys
class MyClock(QtCore.QObject):
"""
Must inherited QObject to emit a Signal
"""
def __init__(self):
super().__init__()
self.timer = QtCore.QTimer()
self.timer.start(1000.)
def Start(self):
self.timer.timeout.connect(self.Tick)
def Tick(self):
t = time.time()
print ("Emit: ",t)
self.emit(QtCore.SIGNAL("SEND(float)"),t)
class ClockDisplay():
def __init__(self):
super(ClockDisplay,self).__init__()
def Display(self,t):
print ("Received: ", t)
BUG:QTimer 槽(Tick)被调用(clock.Start)在连接信号显示之前:
if __name__ == "__main__":
app = QApplication(sys.argv)
clock = MyClock()
clock.Start()
display = ClockDisplay()
clock.connect(QtCore.SIGNAL("SEND(float)"),display.Display)
警告信息
*** 排序警告 ***
QMetaObject 'MyClock' 中的信号和槽排序不正确,这可能会导致问题。
1 槽 Tick()
2!信号发送(浮动)
clock.connect(QtCore.SIGNAL("发送(浮动)"),display.Display)
并且显示器未收到 SEND。
WORKS:QTimer 插槽(Tick)在连接信号显示后被调用(clock.Start)。
if __name__ == "__main__":
app = QApplication(sys.argv)
clock = MyClock()
display = ClockDisplay()
clock.connect(QtCore.SIGNAL("SEND(float)"),display.Display)
clock.Start()
对我来说,在这两种情况下,它们仅在我在第一种情况下收到警告时起作用。此警告仅表示信号和槽应在 QMetaObject 中排序,但在这种情况下它们不是,因为首先添加了“Tick”槽,然后添加了“SEND”信号。可能 Qt 或 shiboken 以某种需要排序的方式使用信号和槽,所以它会抛出警告。
我的建议是您不要使用创建信号和槽的旧语法,而是使用“Signal”和“Slot”:
from PySide2 import QtCore
import time
import sys
class MyClock(QtCore.QObject):
SEND = QtCore.Signal(float)
def __init__(self):
super().__init__()
self.timer = QtCore.QTimer()
self.timer.start(1000.0)
def Start(self):
self.timer.timeout.connect(self.Tick)
def Tick(self):
t = time.time()
print("Emit: ", t)
self.SEND.emit(t)
class ClockDisplay:
def Display(self, t):
print("Received: ", t)
if __name__ == "__main__":
app = QtCore.QCoreApplication(sys.argv)
clock = MyClock()
clock.Start()
display = ClockDisplay()
clock.SEND.connect(display.Display)
sys.exit(app.exec_())
Py3/PySide2 5.13.2 Windows
我有两个 类:一个时钟用计时器发出信号/一个显示器打印时间
import PySide2
from PySide2 import QtCore, QtWidgets, QtGui
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import Signal, Slot
import time
import sys
class MyClock(QtCore.QObject):
"""
Must inherited QObject to emit a Signal
"""
def __init__(self):
super().__init__()
self.timer = QtCore.QTimer()
self.timer.start(1000.)
def Start(self):
self.timer.timeout.connect(self.Tick)
def Tick(self):
t = time.time()
print ("Emit: ",t)
self.emit(QtCore.SIGNAL("SEND(float)"),t)
class ClockDisplay():
def __init__(self):
super(ClockDisplay,self).__init__()
def Display(self,t):
print ("Received: ", t)
BUG:QTimer 槽(Tick)被调用(clock.Start)在连接信号显示之前:
if __name__ == "__main__":
app = QApplication(sys.argv)
clock = MyClock()
clock.Start()
display = ClockDisplay()
clock.connect(QtCore.SIGNAL("SEND(float)"),display.Display)
警告信息 *** 排序警告 *** QMetaObject 'MyClock' 中的信号和槽排序不正确,这可能会导致问题。 1 槽 Tick() 2!信号发送(浮动) clock.connect(QtCore.SIGNAL("发送(浮动)"),display.Display)
并且显示器未收到 SEND。
WORKS:QTimer 插槽(Tick)在连接信号显示后被调用(clock.Start)。
if __name__ == "__main__":
app = QApplication(sys.argv)
clock = MyClock()
display = ClockDisplay()
clock.connect(QtCore.SIGNAL("SEND(float)"),display.Display)
clock.Start()
对我来说,在这两种情况下,它们仅在我在第一种情况下收到警告时起作用。此警告仅表示信号和槽应在 QMetaObject 中排序,但在这种情况下它们不是,因为首先添加了“Tick”槽,然后添加了“SEND”信号。可能 Qt 或 shiboken 以某种需要排序的方式使用信号和槽,所以它会抛出警告。
我的建议是您不要使用创建信号和槽的旧语法,而是使用“Signal”和“Slot”:
from PySide2 import QtCore
import time
import sys
class MyClock(QtCore.QObject):
SEND = QtCore.Signal(float)
def __init__(self):
super().__init__()
self.timer = QtCore.QTimer()
self.timer.start(1000.0)
def Start(self):
self.timer.timeout.connect(self.Tick)
def Tick(self):
t = time.time()
print("Emit: ", t)
self.SEND.emit(t)
class ClockDisplay:
def Display(self, t):
print("Received: ", t)
if __name__ == "__main__":
app = QtCore.QCoreApplication(sys.argv)
clock = MyClock()
clock.Start()
display = ClockDisplay()
clock.SEND.connect(display.Display)
sys.exit(app.exec_())