как заблокировать сигналы, поступающие в пользовательские слоты - PullRequest
0 голосов
/ 16 июня 2020

блокирующих сигналов для достижения QObjects довольно просто с использованием QSignalBlocker Class

например

  # 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
как я могу заблокировать def printsomething(self): из печати без использования disconnect при подключении к сигналу clicked?


пример кода

"""
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_())

1 Ответ

0 голосов
/ 22 июня 2020

Вы пытаетесь заблокировать слот, что невозможно. Вы можете блокировать только сигналы объектов, унаследованных от QObject.

В качестве решения вы можете вместо

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

сделать это

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

, которое будет блокировать сигналы главного окна до тех пор, пока вы снова устанавливаете флаг blockSignals на false.

...