2012-08-15 69 views
2

我想用PyQt導入一個頁面並將其添加到使用Qt設計器創建的QStackedWidget中。我想不要觸摸已編譯的頁面代碼或已編譯的MainWindow代碼。我可以顯示MainWindow的罰款,但我似乎無法導入該頁面,並將其添加到我的QStackedWidget。用Python,PyQt,Qt設計器和QStackedWidget導入頁面

這裏是我的主窗口和頁面編譯後的代碼看起來像:

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重疊。

任何幫助將不勝感激。

回答

2

這兩個Ui_*類的定義表明它們是基類爲object的簡單包裝 - 它們不是Qt類。

相反,他們有一個setupUi()方法,它需要一個Qt類的實例作爲第一個參數傳遞。

在你class main.__init__()你正確地傳遞的QMainWindow的情況下(即self),以繼承Ui_MainWindow類的setupUi方法。但是你沒有將正確的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:我已經使用QWidgetAppInfoPage子類,但是如果您的Ui_appInfoPage實際上基於不同的Qt類,那麼您顯然需要更改該子類。

+0

工作。謝謝。 – Voltron43 2012-08-15 18:30:18

+0

我有另一個與這個項目有關的問題:我似乎無法通過self.lineEdit.setText('test')在實際的AppInfoPage類下設置一個AppInfoPage QLineEdit文本,但是我可以使用主類來設置它self.appInfoPage.lineEdit.setText( '試驗')。但是,我能夠使用self.lineEdit.text()讀取AppInfoPage類下的QLineEdit。再次感謝你。 – Voltron43 2012-08-16 16:50:29

+0

@ Voltron43。請爲此啓動一個新問題,並顯示導致您遇到問題的實際代碼。 – ekhumoro 2012-08-16 17:28:18