环境
python3 | |
---|---|
PySide2 | |
信号槽连接
旧式连接
QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"), app, QtCore.SLOT("quit()"))
# 解释为
某个对象 (quit)
的某个信号 (QtCore.SIGNAL("clicked()"))
要连接到某个对象 (app)
的某个槽函数 (QtCore.SLOT("quit()"))
新式连接
self.ui.pushButton_Query.clicked.connect(self.onPushButton_Clicked)
# 解释为: 某个对象(pushBtn)的某个信号(clicked)要连接到某个信号的槽函数上(self.onPushButton_Clicked)
对象内部连接
self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle)
# 解释为
某个对象self.connect要连接信号槽,
连接内容为:
某个对象的某个信号, (angle), (QtCore.SIGNAL("valueChanged(int)"))
连接到某个对象的槽函数上 (cannonField.setAngle)
定义信号
class ClsTest(QtCore.QObject):
signalOutLog = QtCore.Signal(object) # 定义信号, 信号的参数为`object` 因为str的基类为object
def __init__(self):
#super(ClsTest, self).__init__(parent)
super(ClsTest, self).__init__()
print("ClsTest::__init__")
def run(self, strOut):
print("ClsTest::run")
self.signalOutLog.emit(strOut) # 激发信号
如果出现 object has no attribute 'connect
例如: AttributeError: 'PySide2.QtCore.Signal' object has no attribute 'connect'
此处问题是因为虽然对象继承于 QObject
但并没有初始化基类 super(ClsTest, self).__init__()
一定要初始化基类, 才有信号槽的功能
定义槽函数
@QtCore.Slot(object) # 定义槽函数, 接受一个参数 object, 因为str的基类是object
def outLog(self, strLog):
strCurTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime((time.time()))))
self.ui.lstWidget_SampleLog.insertItem(0, strCurTime + ": " + strLog)
连接信号槽
objTest = ClsTest()
objTest.signalOutLog.connect(self.outLog) #连接信号槽
objTest.run("PushButton Clicked! %s" % strFmt) # 调用函数