在self.ui.onceBut.setEnabled(True)
self
指對話框,讓你得到錯誤,因爲你的onceBut
在你mainWindow
不onceDlg
對話框。
解決方案:爲@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_())
通信經常使用信號和槽完成,但它不是唯一的方法,並得到一個很好的答案,你將不得不發佈更多的代碼。 –