【问题标题】:Do signals contain data pyqt5?信号是否包含数据 pyqt5?
【发布时间】:2020-05-31 15:12:32
【问题描述】:

我无法理解信号是否包含某些数据。 例如,信号 windowTitleChanged 包含一个 str 类型的数据,需要将其传递给它的插槽:

self.windowTitleChanged.connect(lambda x  : self.onTitle(x)) 

## or self.windowTitleChanged.connect(self.onTitle) which also automatically sends a data

def onTitle(self,k):
        print(k)

虽然像clicked 这样的一些信号不会发送数据,除非它们被设置为checkable(其中包含布尔类型数据)。在下面的代码中单击 pushBotton 没有任何作用(令我惊讶的是,尽管 def buttonClicked(self,pressed) 需要 pressed 参数,但它并没有引发错误。

btn2.clicked.connect(self.buttonClicked)

def buttonClicked(self,pressed):
        if pressed:

            self.statusBar().showMessage("l")

在我看来,像windowTitleChanged 这样的一些信号包含一个数据并且可以在槽内使用,而有些则包含一个 None 类型的数据(比如clicked 信号)。 我理解的对吗?

【问题讨论】:

  • QPushButton.clicked 将在发出时发送数据,即使按钮不可检查但它发送值 False 这就是为什么在您的按钮示例中没有任何反应。

标签: python pyqt5 signals signals-slots


【解决方案1】:

在我看来,像windowTitleChanged 这样的一些信号包含一个数据并且可以在槽内使用,而有些则包含一个 None 类型的数据(如clicked 信号)。我理解的对吗?

是的,你是对的。您甚至可以通过创建自定义信号来看到这一点。

from PyQt5.QtCore import pyqtSignal, Qobject
class Analyzer(QObject):
    analyze_completed = pyqtSignal(bool)

在上面的 sn-p 中,如果您使用 bool 发出 analyze_completed 信号,则连接到此信号的插槽将接收 bool 作为参数。

【讨论】:

  • 那么可以肯定地说Qt中的每个内置信号都包含一个可以在需要时使用的数据吗?我怎么知道什么信号包含什么数据?
  • 我不知道 every 内置信号是否包含数据,但我可以说它不一定是。最好检查一下你需要处理的参数是什么。
  • 来自Qt docs: 信号的签名必须与接收槽的签名匹配。 (事实上​​,一个槽的签名可能比它接收的信号更短,因为它可以忽略额外的参数。) 所以看起来你可以忽略你不感兴趣的参数,但我不知道是否这对 PyQt 有效。
  • @Asocia 是的,这对 PyQt5 有效。致 OP:您可以使用 Qt 官方文档找出哪个信号发送了哪些数据。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2015-05-08
  • 1970-01-01
  • 2017-05-09
  • 2017-03-04
  • 2015-05-07
  • 2016-07-17
  • 2017-03-25
相关资源
最近更新 更多