获取与“QPushButton.clicked.connect”信号关联的功能

时间:2015-08-18 14:41:28

标签: python qt pyqt pyside qpushbutton

我正在尝试获取有关在PySide中点击按钮的时间的统计信息。

数据存储在一个字典中,我希望该键是点击的函数名称:

  

示例:{“myAwesomeFunc”:15,“anotherFunc”:4}

我首先将带有数百个按钮的现有(Autodesk)Maya-UI转换为QObject。

然后,我使用findChildren(QPushButton)方法列出所有按钮,并使用getStats()将我自己的btn.clicked.connect(getStat)函数连接到每个按钮。

这样,按钮将在单击时执行两个功能,从UI执行原始功能,以及将增加词典的stat功能。

所以,我遇到的问题是如何查询与按钮的“点击”方法相关联的原始函数名称?

示例:

def myAwesomeFunc():
    return

btn = QtGui.QPushButton()
btn.clicked.connect(myAwesomeFunc)

然后,我正在寻找的是这样的:

funcList = btn.clicked.getFunctions()
myFunc = funcList[0]

print myFunc.__name__
result : "myAwesomeFunc"

1 个答案:

答案 0 :(得分:1)

信号可以连接到许多插槽,这些连接可能会随时间而变化。虽然原则上框架知道要调用哪些信号,但要了解这些插槽并不容易(另请参阅Determine signals connected to a given slot in Qt)。但是,在PyQt5中实际存在QSignalSpy,所以可以考虑使用PyQt5。

您似乎只想为统计字典获取有意义的键字符串值。这可以是保存信号的对象的标识符或插槽的标识符(如上所示的第一个连接的插槽)。使用信号作为键可以统计每个信号(按钮)发出的频率,并使用插槽作为键,可以统计信号调用每个插槽的频率。这不必相同,因为例如不同的信号可以连接到同一个插槽。为了避免这种情况,你实际上必须将信号的名称和插槽的名称存储为字典中的键(所以你知道是谁打电话给谁。

我能想到的最简单的方法是使用手动选择的密钥字符串来包装信号连接调用并插入调用统计信息的代码。

所以搜索并替换所有

btn.clicked.connect(myAweSomeFunc)

通过

my_connect(btn.clicked, myAweSomeFunc, 'myAweSomeFunc')

from functools import partial
def my_connect(signal, slot, key):
    # connect signal to slot
    signal.connect(slot)
    # connect signal to statistics function using key as key
    signal.connect(partial(getStats, key))

def getStats(key):
    statistics[key] += 1

缺点是必须手动选择密钥字符串。这可能会变得单调乏味。您可能希望使用正则表达式替换,以便将插槽的名称复制为字符串,以便自动完成整个任务。