【发布时间】:2016-07-28 13:52:48
【问题描述】:
我正在尝试在信号和插槽之间创建一个简单的连接,但发现自己在尝试调用额外函数时遇到了困难。我有两个选择。这是调用我的课程的代码。
(选项 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)
并像这样实现:
class MyClass(QPushButton):
mysig = pyqtSignal()
def __init__(self, name: str) -> None:
super().__init__(name)
self._name = name
def mousePressEvent(self, *args, **kwargs):
self.mysig.emit()
self.log_info()
def log_info(self):
log(self._name)
这很有效。但我不确定我的实现是否有意义。感觉有点hacky。我不想使用这个最后的选项,我希望有一个更清洁的选项。
【问题讨论】:
标签: python qt pyqt signals-slots