简体   繁体   English

PyQt用dict发出信号

[英]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

EDIT (add working example): 编辑(添加工作示例):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM