在 pyside2 中获取绑定 SignalInstance 的签名

Posted

技术标签:

【中文标题】在 pyside2 中获取绑定 SignalInstance 的签名【英文标题】:Get signature of a bound SignalInstance in pyside2 【发布时间】:2021-11-15 14:34:24 【问题描述】:

我正在尝试找到一种方法来获取 PySide 中绑定 SignalInstance 的签名。

举个例子:

from PySide2.QtCore import Signal, QObject

class MyObj(QObject):
    some_signal = Signal(int)

obj = MyObj()
sig_instance = obj.some_signal

如果我有一个指向objMyObj 本身的指针,我可以使用obj.metaObject().method(5).methodSignature() 来访问some_signal 的签名......但是如果我只有一个指向sig_instance 的指针呢?

在 C 中,SignalInstance 将签名保存在私有结构 PySideSignalInstancePrivate (here) 中......但是经过大量挖掘后,我一直无法想出恢复该签名的方法只给出pythonSignalInstance

提示?


更新:

如果不访问obj 本身的元对象真的不可能。我有这个愚蠢的解决方案......但仍然很想知道是否有更好的方法。

try:
    sig_instance.emit(*(1,) * 50)  # emit with ridiculous args
except TypeError as e:
    print(str(e).split(' only accepts')[0])  # parse err

我还要注意 PyQt5.QtCore.pyqtBoundSignal 确实有一个属性 .signal 保存签名的字符串形式

【问题讨论】:

我认为不可能,反正信息在QObject的QMetaObject中。 @tlambert 请问你为什么需要这个? 当然,“一般”用例是提供signal_instance.emit 作为对其他事物的回调。如果其他东西可以检查signal_instance.emit 的签名,那就太好了(就像Qt 本身在使用connect(some_callback) 时所做的那样...... Qt 能够聪明地不为 some_callback 提供太多参数)。不幸的是:inspect.signature(sig_instance.emit) 给了Signature (*args: typing.Any)... 没有太大帮助。具体用例在这里:github.com/tlambert03/psygnal/issues/47 @tlambert 是的,我在 PySide 中也发现了同样的问题。也许你可以提交一份关于 Qt 的错误报告? 当然可以。几乎从那里开始,但后来胆怯来到这里:) 【参考方案1】:

我在另一个question 中给出了这个解决方案。

如果您在使用 Signal 时遇到错误,那是因为 Qt/PySide 做了一些魔术并将 Signal 转换为 SignalInstance。我的解决方案是强制转换 SignalInstance 以获得正确的提示。

from typing import cast
from PySide2.QtCore import Signal, SignalInstance

class MyObj(QObject):
    some_signal = cast(SignalInstance, Signal(int))

obj = MyObj()
sig_instance = obj.some_signal

【讨论】:

谢谢,但这不是打字问题。我有一个应用程序,我想知道 some_signal 期望的参数数量(即本例中的 1)。但无法访问MyObjobj

以上是关于在 pyside2 中获取绑定 SignalInstance 的签名的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 QML 从 PySide2 插槽(服务调用)获取对象列表?

PySide2 ,按钮没有得到 setStyleSheets

带有 PySide2 的文件浏览器:获取文件的路径,然后终止 GUI

Pyside2.QtCore.QObject 不是 MyTableWidget 的直接基类——PySide2 出错

QOpenGLFunctions 和 PySide2

Maya PySide2 UI 获取 QLineEdit 值