第一个 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 程序失败的主要内容,如果未能解决你的问题,请参考以下文章