第一个pyqt程序失败

时间:2014-02-09 22:13:06

标签: python qt signals-slots

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

除了这个问题,我想知道信号槽代码是否正确。

2 个答案:

答案 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()