使用Python,PyQt,Qt Designer和&amp ;;导入页面QStackedWidget

时间:2012-08-15 14:23:49

标签: python pyqt qt-designer

我正在尝试使用PyQt导入页面并将其添加到使用Qt Designer创建的QStackedWidget中。我不想触摸编译的页面代码或编译的MainWindow代码。我可以很好地显示MainWindow,但我似乎无法导入页面并将其添加到我的QStackedWidget中。

以下是我的MainWindow和页面编译代码:

我的mainWindow.py

    from PyQt4 import QtCore, QtGui

    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s

    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
    ...

我的appInfoPage.py

    from PyQt4 import QtCore, QtGui

    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s

    class Ui_appInfoPage(object):
        def setupUi(self, appInfoPage):
            appInfoPage.setObjectName(_fromUtf8("appInfoPage"))
    ...

我的main.py

    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    from mainWindow import Ui_MainWindow
    from appInfoPage import Ui_appInfoPage

    class main(QMainWindow, Ui_MainWindow):
      def __init__(self):
        super(QMainWindow, self).__init__()
        self.setupUi(self)
        self.appInfoPage = Ui_appInfoPage()
        self.appInfoPage.setupUi(self.appInfoPage)
        self.stackedWidget.addWidget(self.appInfoPage)
        self.stackedWidget.setCurrentWidget(self.appInfoPage)

    if __name__ == '__main__':
      application = QApplication(sys.argv)
      window = main()
      window.show()
      sys.exit(application.exec_())

当前代码给出了AttributeError: 'Ui_appInfopage' object has no attributes 'setObjectName'错误,如果我改为self.appInfoPage.setupUi(self),则该页面与MainWindow重叠。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

两个Ui_*类的定义表明它们是基本类为object的简单包装器 - 它们不是Qt类。

相反,它们有一个setupUi()方法,需要将Qt类的实例作为第一个参数传递。

class main.__init__()中,您正确地将QMainWindow(即self)的实例传递给继承的setupUi类的Ui_MainWindow方法。但是你没有将正确的Qt类的实例传递给self.appInfoPage.setupUi,这就是你获得AtrributeError的原因。

解决此问题的一种方法是创建Ui_appInfoPage的子类,然后将 的实例传递给堆栈小部件:

class AppInfoPage(QWidget, Ui_appInfoPage):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.setupUi(self)
...

    self.appInfoPage = AppInfoPage(self)
    self.stackedWidget.addWidget(self.appInfoPage)

NB :我已将QWidget用于我的AppInfoPage子类,但如果Ui_appInfoPage实际上基于不同的{{1}},您显然需要更改Qt课。