【问题标题】:Importing Pages with Python, PyQt, Qt Designer, & QStackedWidget使用 Python、PyQt、Qt Designer 和 QStackedWidget 导入页面
【发布时间】:2012-08-11 20:30:03
【问题描述】:

我正在尝试使用 PyQt 导入页面并将其添加到使用 Qt 设计器创建的 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),页面会与主窗口重叠。

任何帮助将不胜感激。

【问题讨论】:

    标签: python pyqt qt-designer


    【解决方案1】:

    两个Ui_* 类的定义表明它们是具有object 基类的简单包装器——它们不是Qt 类。

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

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

    纠正此问题的一种方法是创建Ui_appInfoPage 的子类,然后将that 的实例传递给您的stacked-widget:

    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)
    

    注意:我已将QWidget 用于我的AppInfoPage 子类,但如果您的Ui_appInfoPage 实际上基于不同的Qt 类,您显然需要更改它。

    【讨论】:

    • 我有另一个与此项目相关的问题:我似乎无法通过 self.lineEdit.setText('test') 在实际 AppInfoPage 类下设置 AppInfoPage QLineEdit 文本,但我能够使用 self.appInfoPage.lineEdit.setText('test') 在主类下设置它。但是,我可以使用 self.lineEdit.text() 读取 AppInfoPage 类下的 QLineEdit。再次感谢您。
    • @Voltron43。请为此提出一个新问题,并显示导致您出现问题的实际代码。
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2020-12-02
    • 2017-08-11
    • 2022-12-02
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多