我正在尝试使用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重叠。
非常感谢任何帮助。
答案 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课。