2014-02-09 27 views
0

我是Qt4的使用经验,但现在尝试使用python进入Qt编程。第一个pyqt程序失败

它的工作原理主要是,但现在我遇到一个基本的Python程序我也没弄明白:

TypeError: setupSignalSlots() takes 1 positional argument but 2 were given

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

而且这个问题我不知道,如果信号段代码是正确的。

回答

3

您发布的代码有几处错误。

首先,OnQuitMainWindow插槽需要一个self参数。然而,你不需要明确传递这个参数,因为python会自动完成。其次,当您连接到插槽时,您需要通过self访问它。最后,quit不是QApplication的静态方法,因此您需要通过实例调用它(例如qApp.quit())。 (和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() 

UPDATE

还有一件事我错过:你使用uic.loadUi的方式是指添加的对象在Qt Designer中将最终成为MainWindow实例的直接属性。所以它应该是self.actionQuit,而不是self.ui.actionQuit。此外,由于该对象似乎是QAction,因此信号应该是triggered,而不是clicked

+0

好吧,我需要阅读更多关于pyhtons的课程方式。然而,这里的代码因为'AttributeError:'MainWindow'对象没有属性'ui'' –

+0

@MatthiasPospiech而失败。道歉 - 我错过了那一个。我相应地更新了我的答案。 – ekhumoro

+0

代码如何看起来像ui保存在'self.ui'中? –

1

你不需要将self传递给一个类的方法;它会自动为您完成。只需做self.setupSignalSlots()

相关问题