【问题标题】:PyQt emit signal with dictPyQt 用 dict 发出信号
【发布时间】:2017-10-13 08:51:54
【问题描述】:

我想发出定义的信号:

finished = pyqtSignal(dict)

# other place it's connected to function:
def finised(self, dict_result):

我称它为 self.finished.emit({"bk": {}}) 并且它有效。
现在我用self.finished.emit({2: {}})调用它,它不起作用!!

Traceback(最近一次调用最后一次): 运行中的文件“/home/sylwek/workspace/t2-pv/Manager.py”,第 452 行 self.finished.emit({2: {}}) TypeError: TesterManager.finished[dict].emit(): argument 1 has unexpected type '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_())

【问题讨论】:

  • 令人惊讶的是,它适用于带有 PyQt4 的 Python-2.7。如果它不适用于 PyQt5,我认为这是一个错误。
  • 它可能在过去有效.. 但我不确定.. 我可以在哪里提供有关此错误的信息? sb else 可以确认与我有相同的错误吗?
  • 最近有人在 PyQt 邮件列表 FWIW 上 reported the same issue

标签: python python-3.x qt pyqt pyqt5


【解决方案1】:

pyqtSignal 定义中使用object 而不是dict。例如

class Emiterer(QtCore.QThread):
    f = QtCore.pyqtSignal(object)

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

您可以使用

检查此(针对您的特定班级)
m = Emiterer.staticMetaObject
method = m.method(m.methodCount() - 1)  # the last defined signal or slot
print(method.methodSignature())

这将打印PyQt5.QtCore.QByteArray(b'f(QVariantMap)')

【讨论】:

  • 我一测试就谢谢你。我会检查作为答案。
猜你喜欢
  • 2018-08-02
  • 2016-11-16
  • 2021-12-17
  • 2013-08-24
  • 2018-01-15
  • 2013-07-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多