[英]PyQt emit signal with dict
I wanna to emit signal that is defined: 我想发出定义的信号:
finished = pyqtSignal(dict)
# other place it's connected to function:
def finised(self, dict_result):
I call it self.finished.emit({"bk": {}})
and it works. 我称之为
self.finished.emit({"bk": {}})
并且它有效。
Now I call it with self.finished.emit({2: {}})
and it don't work!! 现在我用
self.finished.emit({2: {}})
调用它并且它不起作用!!
Traceback (most recent call last): File "/home/sylwek/workspace/t2-pv/Manager.py", line 452, in run self.finished.emit({2: {}}) TypeError: TesterManager.finished[dict].emit(): argument 1 has unexpected type 'dict'
回溯(最近调用最后一次):文件“/home/sylwek/workspace/t2-pv/Manager.py”,第452行,运行self.finished.emit({2:{}})TypeError:TesterManager.finished [ dict] .emit():参数1有意外类型'dict'
Is it normal? 这是正常的吗? I can change
{2: {}}
to {'2': {}}
but I would like to understand why and be sure there will be no other surprises! 我可以将
{2: {}}
更改为{'2': {}}
但我想了解原因,并确保不会有任何其他惊喜!
I use PyQt 5.8.2-2 and python 3.6.1-1 我使用PyQt 5.8.2-2和python 3.6.1-1
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication
class Emiterer(QtCore.QThread):
f = QtCore.pyqtSignal(dict)
def __init__(self):
super(Emiterer, self).__init__()
def run(self):
self.f.emit({"2": {}})
# self.f.emit({2: {}}) < == this don't work!
class Main(QtWidgets.QMainWindow):
def __init__(self):
super(Main, self).__init__()
self.e = Emiterer()
self.e.f.connect(self.finised)
self.e.start()
def finised(self, r_dict):
print(r_dict)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
m = Main()
m.show()
sys.exit(app.exec_())
Use object
instead of dict
in the pyqtSignal
definition. 在
pyqtSignal
定义中使用object
而不是dict
。 Eg 例如
class Emiterer(QtCore.QThread):
f = QtCore.pyqtSignal(object)
The reason for this is that signals defined as pyqtSignal(dict)
are actually interpreted the same as pyqtSignal('QVariantMap')
by PyQt5 and QVariantMap can only have strings as keys. 原因是定义为
pyqtSignal(dict)
信号实际上被pyqtSignal('QVariantMap')
解释为与pyqtSignal('QVariantMap')
相同,而QVariantMap只能将字符串作为键。
You can check this (for your specific class) with 您可以查看(针对您的特定课程)
m = Emiterer.staticMetaObject
method = m.method(m.methodCount() - 1) # the last defined signal or slot
print(method.methodSignature())
This would print PyQt5.QtCore.QByteArray(b'f(QVariantMap)')
这将打印
PyQt5.QtCore.QByteArray(b'f(QVariantMap)')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.