PyQt用dict发出信号

S.R*_*S.R 2 python qt pyqt python-3.x pyqt5

我想发出定义的信号:

finished = pyqtSignal(dict)

# other place it's connected to function:
def finised(self, dict_result):
Run Code Online (Sandbox Code Playgroud)

我称它为self.finished.emit({"bk": {}})有效.
现在我打电话给它,self.finished.emit({2: {}})它不起作用!!

回溯(最近调用最后一次):文件"/home/sylwek/workspace/t2-pv/Manager.py",第452行,运行self.finished.emit({2:{}})TypeError:TesterManager.finished [ dict] .emit():参数1有意外类型'dict'

这是正常的吗?我可以改变{2: {}},{'2': {}}但我想了解为什么,并确保没有其他惊喜!

我使用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_())
Run Code Online (Sandbox Code Playgroud)

Ale*_*vec 10

使用object替代dictpyqtSignal定义.例如

class Emiterer(QtCore.QThread):
    f = QtCore.pyqtSignal(object)
Run Code Online (Sandbox Code Playgroud)

这样做的原因是定义的信号pyqtSignal(dict)实际上与pyqtSignal('QVariantMap')PyQt5和QVariantMap的解释相同,只能将字符串作为键.

您可以查看(针对您的特定课程)

m = Emiterer.staticMetaObject
method = m.method(m.methodCount() - 1)  # the last defined signal or slot
print(method.methodSignature())
Run Code Online (Sandbox Code Playgroud)

这会打印出来 PyQt5.QtCore.QByteArray(b'f(QVariantMap)')