【问题标题】:pyqt signal emit with object instance or Nonepyqt 信号发射与对象实例或无
【发布时间】:2019-09-06 01:58:45
【问题描述】:

我想要一个 pyqt 信号,它可以使用 python“object”子类参数或 None 发出。例如,我可以这样做:

valueChanged = pyqtSignal([MyClass], ['QString'])

但不是这个:

valueChanged = pyqtSignal([MyClass], ['None'])
TypeError: C++ type 'None' is not supported as a pyqtSignal() type argument type

或者这个:

valueChanged = pyqtSignal([MyClass], [])
TypeError: signal valueChanged[MyObject] has 1 argument(s) but 0 provided

我也试过 None 没有引号和 c++ 等效的“NULL”。但似乎两者都不起作用。我需要做什么才能完成这项工作?

【问题讨论】:

标签: python pyqt pyside


【解决方案1】:

解决这个问题的一个 hacky 解决方法是定义您的信号以发出 object。由于NoneMyClass 都继承自object,因此它按预期工作。这不需要在插槽中进行铸造。

在 PyQt5 5.11.3 和 Python 3.5.6 中工作

信号

valueChanged = QtCore.pyqtSignal(object)

valueChanged.emit(MyClass())
valueChanged.emit(None)

插槽

valueChanged.connect(slot)

def slot(my_class_instance):
    if my_class_instance:
        my_class_instance.some_method()
    else:
        # my_class_instance is None

【讨论】:

    【解决方案2】:

    您尝试的方法不起作用有几个原因。

    首先,pyqtSignaltype 参数接受 python type 对象或给出 C++ 对象名称的字符串(即 Qt 类)。

    因此,要将None 用作参数类型,您必须传递type(None) 而不是字符串"None"

    其次,None 是特殊情况,允许在不显式选择签名的情况下使用信号的默认重载。

    如果你这样创建信号:

    valueChanged = QtCore.pyqtSignal([MyClass], [type(None)])
    

    然后尝试像这样发出信号:

    self.valueChanged[type(None)].emit(None)
    

    你会得到这样的错误:

    TypeError: Window.valueChanged[MyClass].emit():
    argument 1 has unexpected type 'NoneType'
    

    因此,使用valueChanged[type(None)] 实际上会导致选择默认 签名([MyClass]),然后会收到不匹配的None 参数。

    【讨论】:

      【解决方案3】:

      您不需要指定第二个选项 - 它会接受您的类类型的指针,该指针可能已经是 None 值:

      valueChanged = pyqtSignal(MyClass)
      
      # both will work as is
      inst.valueChanged.emit(MyClass())
      inst.valueChanged.emit(None)
      

      【讨论】:

      • 那么有什么方法可以与 PyQt5 / Python 3.5+ 一起使用吗?我只能考虑将包装类传递给信号,即具有单个属性的类,可以是 None 或 MyClass 对象。不过,这对我来说似乎有点矫枉过正。
      • @FernAndr 几年后,但如果你看看我的回答,已经有一个标准的 python 对象 None 并且你的自定义类型有共同点 - 对象类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2018-08-02
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多