2015-09-30 50 views
1

一個簡單的情況證明是相當棘手的。在類之外訪問一個PyQT控件

我的目標是獲得一個窗口,在另一個窗口中更新窗口小部件的狀態。 爲了解釋:

我有窗口中的一些「數據」,我希望它寫進窗口B的文本編輯插件的主窗口和細節的小部件

class MainWin(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(1127, 880) 

     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.textEdit = QtGui.QTextEdit(self.centralwidget) 
     self.textEdit.setGeometry(QtCore.QRect(20, 150, 1081, 661)) 
     self.textEdit.setObjectName(_fromUtf8("textEdit")) 
     self.textEdit.isUndoRedoEnabled() 

我是什麼目前失敗獲取是一個簡單的方法,從另一個窗口(和另一個文件)調用可以改變textEdit內的內容。 不知道我做錯了,但是當我嘗試導入類或從類中的方法我似乎總是有問題與

TypeError: unbound method updEdit() must be called with MainWin instance as first argument (got nothing instead)

我非常願意聽取建議,並感謝提前!

編輯#1

從文件Rep.py(第二個窗口,我簡單的調用)

def addTemplate(self): 
     data = self.textBrowser.toPlainText() 
     MainWin.MainWin.addText(MainWindow.MainWin,data) 
     self.close() 

從第一個窗口,所有我需要做的是:

def addText(self,data): 
    self.textEdit.setText(data) 

我對OOP相當陌生,所以請原諒我,如果有一些相當愚蠢的錯誤。

+0

向你的班級添加一個方法,設置文本然後從任何你想要的地方調用它。 – multivac

+0

顯示您嘗試調用此方法的代碼。可能你試圖在MainWin類上調用它,而不是在它的一個實例上調用它。 – mata

+0

更新了,可能我正在做你提到的錯誤,但我不知道如何解決它 – Eloh666

回答

0

當您創建第二個窗口,傳遞到第一窗口的引用,並存儲爲一個屬性:

class SecondWindow(QMainWindow): 
    def __init__(self, firstwindow, parent=None): 
     super(SecondWindow, self).__init__(parent) 
     self.firstwindow = firstwindow 
     ...    

    def addTemplate(self): 
     data = self.textBrowser.toPlainText() 
     self.firstwindow.addText(data) 

如果第二個窗口是QMainWindowQDialog,你也可以做第一窗口的第二窗口的父 - 在這種情況下,就沒有必要將其存儲爲一個屬性,你可以只是做:

 self.parent().addText(data) 

做這本方式也意味着第一個窗口關閉時第二個窗口會自動關閉。

+0

謝謝,我已經嘗試過,但是當我嘗試給方法的第一個窗口作爲參數時,我得到的是AttributeError:'模塊'對象沒有屬性'MainWindow'(btw是第一個的名字)。 我傳遞給__init__的是mainWin.MainWindow。我之前已經導入了mainWin,但是到了mid的時候,我可能會有一個循環導入: 第二個窗口從第一個窗口開始,因此我已經導入到第一個窗口。另外我需要編輯第二個窗口的第一個窗口。無論哪種方式,再次感謝! – Eloh666