我有一个QObject,它作为一个控制器。 此QObject引用了QPushButton。 此QOjbect有一个方法设置为在QPushButton的点击事件上触发。
例如:
class MyController(QObject):
def __init__(self, parent=None):
super(MyController, self).__init__(parent)
self.some_ref = ....
self.button = self.some_ref.button (returns QPushButton)
self.button.clicked.connect(self.button_clicked)
# @Slot(type)
def button_clicked(self):
print 'button clicked: ', self.sender()
# print 'button clicked (no sender req.)
这里,button_clicked不会被触发。
我尝试使用@Slot()
,@Slot(QObject)
,@Slot(type)
,@Slot(str)
,@Slot(int)
对其进行修饰,但仍无效。
我做错了什么?
如果我使用..clicked.connect(lambda: self.button_clicked)
,它当然有效。所以我认为这是一种类型不匹配,但@Slot(..)
装饰不应该修复它吗?
谢谢。
答案 0 :(得分:1)
我不知道问题是@Slot()是否被注释(开头有#),但这段代码适用于我(它在python 3中,但只是更改打印行)
import sys
from PySide.QtGui import *
from PySide.QtCore import *
class Window(QMainWindow):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.button = QPushButton()
self.button.setText("Test")
self.setCentralWidget(self.button)
def GetButton(self):
return self.button
class MyController(QObject):
def __init__(self, parent=None):
super(MyController, self).__init__(parent)
self.button = parent.GetButton() #(returns QPushButton)
self.button.clicked.connect(self.button_clicked)
@Slot()
def button_clicked(self):
print('button clicked: ', self.sender())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
controller = MyController(window)
window.show()
app.exec_()
sys.exit(0)
答案 1 :(得分:0)
可能可以尝试released
信号而不是clicked
信号,因为点击的信号在按钮被激活时发出(即按下然后在鼠标光标位于按钮内时释放)
或者您可以尝试连接信号的#method 2。
class MyController(QObject):
def __init__(self, parent=None):
super(MyController, self).__init__(parent)
self.some_ref = ....
self.button = self.some_ref.button
# method 1
self.button.released.connect(self.button_clicked)
# method 2
self.connect(self.button, SIGNAL('released()'), self.button_clicked)
def button_clicked(self):
print "yipee it works..."