2016-04-07 40 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