如何阻止信号到达自定义插槽

Posted

技术标签:

【中文标题】如何阻止信号到达自定义插槽【英文标题】:how to block signals reaching to custom slots 【发布时间】:2020-10-05 16:18:50 【问题描述】:

使用QSignalBlocker Class 阻止信号到达 QObjects 相当简单

喜欢

  # functionality
        self.clickbuton.clicked.connect(self.printsomething)
        self.clickbuton.clicked.connect(self.blockprint)

    def printsomething(self):
        print("dude")

    def blockprint(self):
        self.clickbuton.blockSignals(True)

def printsomething(self): 这样的自定义槽呢?

尝试相同的操作,但阻止 def printsomething(self): 打印

 def blockprint(self):
        self.printsomething.blockSignals(True)

会给AttributeError: 'function' object has no attribute 'blockSignals'

看起来这个方法只适用于QObjects 在连接到clicked 信号时,如何在不使用disconnect 的情况下阻止def printsomething(self): 打印?

代码示例

"""
Testing Template for throw away experiment

"""


import sys
import os

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg




class MainWindow(qtw.QWidget):
    def __init__(self):
        super().__init__()

        # widget
        self.clickbuton = qtw.QPushButton("click me")

        # set the layout
        layout = qtw.QVBoxLayout()
        layout.addWidget(self.clickbuton)
        self.setLayout(layout)

        # functionality
        self.clickbuton.clicked.connect(self.printsomething)
        self.clickbuton.clicked.connect(self.blockprint)

    def printsomething(self):
        print("dude")

    def blockprint(self):
        self.printsomething.blockSignals(True)
        # self.m_blocker = qtc.QSignalBlocker(self.clickbuton)




if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)

    main = MainWindow()
    main.show()

    sys.exit(app.exec_())

【问题讨论】:

@eyllanesc 添加 你能解释一下你希望得到什么吗,你的解释不是很清楚。 注意:QSignalBlocker 会阻止对象发出信号,我认为您遇到了 XY 问题,您可以详细说明您想要获得的行为。 @eyllanesc 如何阻止def printsomething(self): 在连接到按钮单击信号时不使用disconnect 进行打印 根据您的指示,我确认您有 XY 问题,如果您不想使用断开连接,请使用标志,例如:self._flag = True on __init__def printsomething(self): @987654337 @# foo code 【参考方案1】:

您要做的是阻止一个不可能的插槽。 您只能阻止从 QObject 继承的对象的信号。

作为一种解决方案,您可以代替

def blockprint(self):
        self.printsomething.blockSignals(True)

这样做

def blockprint(self):
        self.blockSignals(True)

这将阻止主窗口信号,直到您再次将 blockSignals 标志设置为 false。

【讨论】:

以上是关于如何阻止信号到达自定义插槽的主要内容,如果未能解决你的问题,请参考以下文章

传递自定义类来连接(信号和插槽)

Maya PySide:当我尝试将自定义信号连接到插槽时,Maya 崩溃

c_cpp 用于调试信号的自定义插槽,验证它们是否被触发

QT 插槽和信号参数

Qt4中的信号和插槽 - 不工作

如何从 Alexa Skill 中的用户随机输入中提取自定义插槽