2013-07-31 21 views
1

你好,我正在使用python 2.7來處理數據存檔程序。我有一個主窗口,並有一些元素(按鈕,文本行等)點擊一個按鈕打開一個對話框的形式頁面。用戶在該對話框頁面上選擇他們的答案。對話框頁面有一個名爲「保存」的按鈕。點擊保存按鈕對話框類將用戶的選擇保存到數據庫。我想這樣做,當用戶點擊保存按鈕時,它會啓用一些未啓用的mainWindow元素。mianwindow和python中的對話框之間的通信

self.ui.onceBut.setEnabled(真)等

但我正在一個錯誤:

AttributeError的:我與這些代碼進入到對話框類和保存按鈕功能做這個'一旦Dg'對象沒有屬性'onceBut'

onceDlg是對話框頁面的類名。

我該如何解決這個問題,我可以做我想做的事情?提前致謝。

+0

通信經常使用信號和槽完成,但它不是唯一的方法,並得到一個很好的答案,你將不得不發佈更多的代碼。 –

回答

0

self.ui.onceBut.setEnabled(True)self指對話框,讓你得到錯誤,因爲你的onceBut在你mainWindowonceDlg對話框。

解決方案:爲@Radio說 - Qt中的組件之間的通信使用信號和槽經常做的,但它不是唯一的方法。 更簡單的方法是簡單地將主窗口傳遞給對話框窗口,這樣您就可以在對話窗口內使用它的按鈕或任何你想要的操作。在下一個例子中,我已經在dialog = Dialog(self)行中完成了這個操作,其中self是指MainWindow,它在Dialog的內部用作mainWin。運行它,點擊第一個按鈕,對話框將會顯示,點擊對話框中的save按鈕,主要的第二個按鈕將被改變和禁用。 我希望我已經幫助你。在Qt的組件之間

import sys 
from PyQt4 import QtCore, QtGui 

class Dialog(QtGui.QDialog): 
    def __init__(self, mainWin): 
     QtGui.QDialog.__init__(self,mainWin) 
     self.setWindowTitle(self.tr("Dialog window")) 
     self.main = mainWin 

     button = QtGui.QPushButton() 
     button.setText("Save (disable dummy button)") 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(button) 
     self.setLayout(layout) 

     self.connect(button, QtCore.SIGNAL("clicked()"), self.save) 
     self.resize(200, 100) 

    def save(self): 
     self.main.button2.setEnabled(False) 
     self.main.button2.setText("changed from dialog") 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.setWindowTitle(self.tr("Main window")) 

     self.button1 = QtGui.QPushButton() 
     self.button2 = QtGui.QPushButton() 
     self.button1.setText("Open dialog") 
     self.button2.setText("Dummy") 

     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button1) 
     layout.addWidget(self.button2) 
     self.window = QtGui.QWidget() 
     self.window.setLayout(layout) 
     self.setCentralWidget(self.window); 

     self.connect(self.button1, QtCore.SIGNAL("clicked()"), self.showDialog) 
     self.resize(360, 145) 

    def showDialog(self): 
     dialog = Dialog(self) 
     dialog.show() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    main = MainWindow() 
    main.show(); 
    sys.exit(app.exec_())