【问题标题】:Get function linked to the "QPushButton.clicked.connect" signal获取链接到“QPushButton.clicked.connect”信号的函数
【发布时间】:2015-08-18 14:41:27
【问题描述】:

我正在尝试获取有关在 PySide 中单击按钮的次数的统计信息。

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

示例:{"myAwesomeFunc" : 15, "anotherFunc" : 4}

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

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

这样做后,按钮将在单击时执行两个函数,一个来自 UI 的原始函数,另一个是我的 stat 函数,它将增加字典。

那么,我卡住的地方是如何查询与按钮的“单击”方法关联的原始函数名称?

例子:

def myAwesomeFunc():
    return

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

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

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

print myFunc.__name__
result : "myAwesomeFunc"

【问题讨论】:

  • 至少在 C++/Qt 中是不可能的,但这也意味着程序架构有问题,所以告诉我们你试图实现什么。也许还有另一种解决方案。也是你(程序员)建立连接,所以如果你需要的话,你可以手动将它添加到一些列表或字典中,因为没有内置的方法来实现这一点。
  • 我已经用我想要做的事情更新了这个问题。让我知道它是否没有意义!
  • 嗯,你说:how many time a button was clickedI'd like the KEY to be the CLICKED-FUNCTION,为什么不是指向按钮的指针(按钮本身)?
  • "我希望 KEY 是 CLICKED-FUNCTION *NAME" 所以,当创建 UI 时,如果有人在其中使用功能 " extractNames()”,然后,我希望密钥是“extractNames”。 UI 可以随时更改,因为它被几个可以随时添加按钮的人使用。指向按钮的指针是什么意思。当 findChildren() 方法列出按钮时,我已经有了按钮? (对不起,我的 Qt 技能非常有限,因为我最近才开始......)
  • 我只是想在 C++ 中所以我使用了单词pointer,在 python 中它只是一个按钮。根据这个答案:stackoverflow.com/questions/2755694/… 正如我之前所说,没有办法做到这一点。据我了解,您需要收集并显示统计信息(单击了多少次按钮,而不是调用了多少次插槽),因此我认为您的 findChildren() 和 getStats 是正确的方法,您需要使用 { QPushButton:15,“另一个QPushButton”:4}

标签: python qt pyqt pyside qpushbutton


【解决方案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

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

【讨论】:

  • answered在这个主题上有一个类似的问题,发现QSignalSpy也没有用。它所做的只是记录发送的参数,而不是它们发送到的位置。添加一个额外的槽来记录发射还有一个大问题:如果代码的某些部分调用btn.clicked.disconnect()怎么办?
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2022-01-08
  • 2012-05-05
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多