三种方式绑定信号槽
网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
这几种方式各有各的优点和缺点。
# 方式一
这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectName 和 QtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))
self.pushButton.setObjectName("pushButton")
# 通过这里自动完成连接信号槽
QtCore.QMetaObject.connectSlotsByName(Form)
此时只需要继承该 UI 文件类然后增加如下方法:
@pyqtSlot()
def on_pushButton_ ...
QRunnable线程池发信号
因为只有继承 QObject 的类才能有信号和自定义信号,而 QRunnable 并不是继承自 QObject ,也不能用多继承的方式,这里考虑定义个全局的 QObject 变量用来存放一些定义好的可复用的信号。
pools 是 QThreadPool 实例
# 看图说话
定义一个全局信号类
在 QRunnable 中发送
PyQt5判断信号是否连接
在 PyQt 中某些情况下需要取消原来的信号连接,此时需要使用 disconnect 方法,但是在逻辑不严谨的情况下可能会导致多次调用 disconnect 方法而导致报错,当然可以通过 try except 来包裹代码。这里通过 isSignalConnected 来判断信号是否连接。
在 QOjbect 文档中这样写到:
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
QByteArray data;
data = get_the_value(); // expensive operation
emit valueChanged(data);
}
通过直接传入信号就行了,但是这在 PyQt 中不可行。需要这么做
#!/usr/bin/en ...