我有Qt4的经验,但现在尝试用python进行Qt编程。
它主要工作,但现在我遇到了一个我没有弄清楚的基本 python 程序:
类型错误: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()
除了这个问题,我想知道信号插槽代码是否正确。
您发布的代码有几个问题。
首先,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
的。
你不需要self
传递给类的方法;它是自动为你完成的。 只要做self.setupSignalSlots()
.