【问题标题】:How can I declare Signal() with optional keyword arguments in pyside6?如何在 pyside6 中使用可选关键字参数声明 Signal()?
【发布时间】:2023-02-22 20:59:31
【问题描述】:

我正在尝试用三个 bool 类型可选关键字参数声明一个 Signal。我已经按照 ChatGPT 和帮助功能的建议尝试了一些方法,但到目前为止还没有成功。

my_signal = Signal(**{'arg1': Optional[bool] = False, 'arg2': Optional[bool] = False, 'arg3': Optional[bool] = False})

my_signal = Signal(arg1=Optional[bool], arg2=Optional[bool], arg3=Optional[bool])

my_signal = Signal(arg1=bool, arg2=bool,arg3=bool)

我分别得到以下错误。

'invalid syntax error'.

TypeError: QtCore.Signal{name, arguments}() takes at most 2 keyword arguments (3 given)

TypeError: 'arg1' is an invalid keyword argument for QtCore.Signal{name, arguments}()

任何人都可以帮助纠正语法。

【问题讨论】:

    标签: python signals-slots pyside6


    【解决方案1】:

    由于Optional 表示boolNone,因此您必须重载信号并且 AFAIK 不存在于 Python 绑定中。

    这里有两种选择(更简单):

    一、性能:

    你有一个私有变量,当它改变时你发出 通知属性已更改的信号。 IE

    class Foo(QObject):
        tripleBoolChanged = Signal()
        def __init__(self):
            super().__init__(None)
            self._triple_bool: tuple[bool | None, bool | None, bool | None] = (None, None, None)
            self.tripleBoolChanged.connect(self.something_that_needs_triple_bool)
    
        def set_triple_bool(self, a: bool | None = None, b: bool | None = None, c: bool | None = None):
            self._triple_bool = a, b, c
            self.tripleBoolChanged.emit()
        def triple_bool(self):
            return self._triple_bool
        def something_that_needs_triple_bool(self):
           print(self.triple_bool())
    
    

    2.容器类。

    创建一个包含该三重布尔值的类并发出实例。 IE

    class FooAlternative(QObject):
        @dataclasses.dataclass
        class TripleBool:
            a: bool | None = None
            b: bool | None = True
            c: bool | None = False
    
    
        tripleBoolChanged = Signal(TripleBool)
    
        def __init__(self):
            super().__init__(None)
            self.tripleBoolChanged.connect(self.something_that_needs_triple_bool)
    
        def emit_triple_bool(self, a: bool | None = None, b: bool | None = None, c: bool | None = None):
            tb = self.TripleBool(a, b, c)
            self.tripleBoolChanged.emit(tb)
            
        def something_that_needs_triple_bool(self, tb: TripleBool):
           print("foo alternative:", tb)
    
    

    Full code here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2012-09-29
      • 2022-07-01
      • 2023-03-06
      相关资源
      最近更新 更多