我有使用Qt4的经验,但现在尝试使用python进入Qt的编程。
它主要工作,但现在我遇到了一个我没想到的基本python程序:
TypeError:setupSignalSlots()接受1个位置参数但是2个被赋予
from PyQt4 import QtGui, uic
from PyQt4 import QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi('MainWindow.ui', self)
self.show()
self.setupSignalSlots(self)
def setupSignalSlots(self):
self.ui.actionQuit.clicked.connect(OnQuitMainWindow)
@QtCore.pyqtSlot()
def OnQuitMainWindow():
print('quit')
QApplication.quit()
除了这个问题,我想知道信号槽代码是否正确。
答案 0 :(得分:3)
您发布的代码存在一些问题。
首先,OnQuitMainWindow
槽需要self
个参数。但是,您不需要显式传递此参数,因为python会自动执行此操作。其次,当您连接到插槽时,您需要通过self
访问它。最后,quit
不是QApplication
的静态方法,因此您需要通过实例(例如qApp.quit()
)调用它。
(另外还有一个挑剔:在python(和Qt,就此而言),它违反惯例,以大写字母开始属性名称)。
进行这些更正后,您的代码应如下所示:
from PyQt4 import QtGui, uic
from PyQt4 import QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi('MainWindow.ui', self)
self.show()
self.setupSignalSlots()
def setupSignalSlots(self):
self.actionQuit.triggered.connect(self.onQuitMainWindow)
@QtCore.pyqtSlot()
def onQuitMainWindow(self):
print('quit')
QtGui.qApp.quit()
<强>更新强>:
我还错过了一件事:你使用uic.loadUi
的方式意味着在Qt Designer中添加的对象最终会成为MainWindow
实例的直接属性。因此它应该是self.actionQuit
,而不是self.ui.actionQuit
。此外,由于此对象似乎是QAction
,因此信号应为triggered
,而不是clicked
。
答案 1 :(得分:1)
您不需要将self
传递给类的方法;它会自动为您完成。只需self.setupSignalSlots()
。