在 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
如果我有一个指向obj
或MyObj
本身的指针,我可以使用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)。但无法访问MyObj
或obj
以上是关于在 pyside2 中获取绑定 SignalInstance 的签名的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过 QML 从 PySide2 插槽(服务调用)获取对象列表?
PySide2 ,按钮没有得到 setStyleSheets
带有 PySide2 的文件浏览器:获取文件的路径,然后终止 GUI