第一个 Pyqt 程序失败



我有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().

最新更新