第一个 pyqt 程序失败

Posted

技术标签:

【中文标题】第一个 pyqt 程序失败【英文标题】:first pyqt program fails 【发布时间】:2014-02-09 22:13:06 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您发布的代码有几个问题。

首先,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

【讨论】:

好的,我需要阅读更多关于 pyhtons 类的方法。然而,这里的代码因为AttributeError: 'MainWindow' object has no attribute 'ui' 而失败 @MatthiasPospiech。抱歉——我错过了那个。我已经相应地更新了我的答案。 代码看起来像这样,ui保存在self.ui中? @MatthiasPospiech。严格来说,您将拥有MainWindow(object),摆脱super 调用,然后执行self.ui = uic.loadUi('MainWindow.ui')。这意味着主窗口的 所有 方法及其属性需要在前面加上 self.ui(例如,self.ui.show()self.ui.actionQuit 等)。但是,我也看到人们只做self.ui = uic.loadUi('MainWindow.ui', self) 而没有其他更改 - 但我真的不明白这一点,因为所有内容都可以通过self @987654345访问@. 好的,到此我就明白了。不过我想知道为什么大多数教程只讨论使用pyuic4 从 ui 生成 py 文件。整个文档页面http://pyqt.sourceforge.net/Docs/PyQt4/designer.html 没有提供任何使用loadUi 的示例。在 Qt/C++ 中加载生成的 ui 代码文件是必须的。使用 python 这似乎没有必要。但大多数示例并未比较这些方法。【参考方案2】:

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

【讨论】:

以上是关于第一个 pyqt 程序失败的主要内容,如果未能解决你的问题,请参考以下文章

pyqt 创建第一个程序(helloworld)

PyQt5的第一个程序

使用PyQt来编写第一个Python GUI程序

pyqt4 - singleapplication - 调出原始窗口以尝试第二次打开应用程序

PyQt5——调整布局(布局管理器)第一个程序

《PyQT5软件开发 - 基础篇》第6章 PyQt5对话框