2016-04-07 2 views
-1

Я пытаюсь создать простую связь между сигналом и слотом, но обнаружил, что застрял, пытаясь вызвать дополнительную функцию. Есть два варианта, к которым я пришел. Вот код, который вызывает мой класс.PyQt5 log a

(Вариант 1):

self.flip = MyClass("Flip Image") 
self.flip.clicked.connect(self.do_flip) 

QWidget затем экземпляр моего класса, чья главная цель состоит в том, чтобы войти сигнал сделал. Это, как я считаю, должен быть реализован мой класс: не

class MyClass(QPushButton): 

    def __init__(self, name: str) -> None: 
     super().__init__(name) 
     self._name = name 

    def mousePressEvent(self, *args, **kwargs): 
     self.log_info() 

    def log_info(self): 
     log(self._name) 

Что я не понимаю, почему слот do_flip не вызывается? Это не имеет никакого смысла для меня, так что я вместо этого попытался перекрывая щелкнул сигнал через

(Вариант 2):

class MyClass(QPushButton): 

    def __init__(self, name: str) -> None: 
     super().__init__(name) 
     self._name = name 

    def clicked(self, *args, **kwargs): 
     self.log_info() 
     #add connect() here? 

    def log_info(self): 
     log(self._name) 

Но с этим кодом я дружественную AttributeError: 'function' object has no attribute 'connect'. Я не могу найти документацию по методу clicked и как он вызывает соединение. Есть ли способ для меня сделать соединение для щелчка по слоту или мне нужно создать собственный сигнал? Я считаю, что это станет очень полезным при попытке переопределить другие сигналы, которые также испускают определенные значения.

Если так это приводит меня к:

Last Resort - Мой собственный сигнал

Класс будет называться так:

self.flip = MyClass("Flip Image") 
self.flip.mysig.connect(self.do_flip) 

И реализован так:

И это работает. Но я не уверен, что моя реализация имеет смысл. Он чувствует себя взломанным. Я бы предпочел не использовать этот последний вариант курорта, и я надеюсь, что есть более чистый вариант.

ответ

1

В Вариант 1 вы перекрывая mousePressEvent метод QPushButton без вызова реализации по умолчанию с помощью super, и это я считаю, является причиной того, почему clicked сигнал никогда не излучается. Например:

class MyClass(QPushButton): 

def __init__(self, name: str) -> None: 
    super().__init__(name) 
    self._name = name 

def mousePressEvent(self, event): 
    self.log_info() 
    super().mousePressEvent(event) 

def log_info(self): 
    log(self._name) 

В Вариант 2 вы объявляете clicked как обычный питона отзывной, а вместо этого он должен быть pyqtSignal(). И это определенно не путь.

Правильный способ добиться того, что вам нужно использовать несколько слотов для того же сигнала, а именно:

class MyClass(QPushButton): 

    def __init__(self, name: str) -> None: 
     super().__init__(name) 
     self._name = name 

    @pyqtSlot() 
    def log_info(self): 
     log(self._name) 

self.flip = MyClass("Flip Image") 
self.flip.clicked.connect(self.do_flip) 
self.flip.clicked.connect(self.flip.log_info) 
+0

В варианте 2, есть ли способ, чтобы переопределить 'clicked' pyqtSignal задается' QAbstractButton' добавить вызов в журнал? – Max

+0

'clicked' не является функцией, но это pyqtSignal. Как я объяснил в сообщении, это определенно не путь. –

+0

Предполагая, что я немного упростил, я бы предпочел не подключать несколько слотов от одного сигнала так, как вы показали мне. – Max

 Смежные вопросы

  • Нет связанных вопросов^_^