环境

python3
PySide2

信号槽连接

旧式连接

  1. QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"), app, QtCore.SLOT("quit()"))
  2. # 解释为
  3. 某个对象 (quit)
  4. 的某个信号 (QtCore.SIGNAL("clicked()"))
  5. 要连接到某个对象 (app)
  6. 的某个槽函数 (QtCore.SLOT("quit()"))

新式连接

  1. self.ui.pushButton_Query.clicked.connect(self.onPushButton_Clicked)
  2. # 解释为: 某个对象(pushBtn)的某个信号(clicked)要连接到某个信号的槽函数上(self.onPushButton_Clicked)

对象内部连接

  1. self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle)
  2. # 解释为
  3. 某个对象self.connect要连接信号槽,
  4. 连接内容为:
  5. 某个对象的某个信号, (angle), (QtCore.SIGNAL("valueChanged(int)"))
  6. 连接到某个对象的槽函数上 (cannonField.setAngle)

定义信号

  1. class ClsTest(QtCore.QObject):
  2. signalOutLog = QtCore.Signal(object) # 定义信号, 信号的参数为`object` 因为str的基类为object
  3. def __init__(self):
  4. #super(ClsTest, self).__init__(parent)
  5. super(ClsTest, self).__init__()
  6. print("ClsTest::__init__")
  7. def run(self, strOut):
  8. print("ClsTest::run")
  9. self.signalOutLog.emit(strOut) # 激发信号

如果出现 object has no attribute 'connect

例如: AttributeError: 'PySide2.QtCore.Signal' object has no attribute 'connect'
此处问题是因为虽然对象继承于 QObject 但并没有初始化基类 super(ClsTest, self).__init__()
一定要初始化基类, 才有信号槽的功能

image.png

定义槽函数

  1. @QtCore.Slot(object) # 定义槽函数, 接受一个参数 object, 因为str的基类是object
  2. def outLog(self, strLog):
  3. strCurTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime((time.time()))))
  4. self.ui.lstWidget_SampleLog.insertItem(0, strCurTime + ": " + strLog)

连接信号槽

  1. objTest = ClsTest()
  2. objTest.signalOutLog.connect(self.outLog) #连接信号槽
  3. objTest.run("PushButton Clicked! %s" % strFmt) # 调用函数