【问题标题】:first pyqt program fails第一个 pyqt 程序失败
【发布时间】: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()

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

【问题讨论】:

    标签: python qt signals-slots


    【解决方案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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      相关资源
      最近更新 更多