2016-04-07 42 views
-1

我試圖創建一個信號和插槽之間的簡單連接,但發現自己卡住試圖調用一個額外的功能。有2個選項我來了。這是調用我的類的代碼。PyQt5記錄信號

(選項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方法以及它如何調用連接時找不到任何文檔。有沒有辦法讓我點擊插槽的連接或我必須創建自己的信號?我發現當嘗試覆蓋發出特定值的其他信號時,這將變得非常有用。

如果是這樣,這導致我:

最後一招 - 我自己的信號

類將被稱爲像這樣:

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

而實現這樣的:

這個工作。但我不確定我的實現是否合理。這感覺有點哈克。我不想使用這個最後的度假選項,我希望有一個更清潔的選項。

回答

1

選項1要覆蓋的QPushButtonmousePressEvent方法,而不調用使用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作爲一個普通的Python調用,而不是它應該是一個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