self
inself.ui.onceBut.setEnabled(True)
指的是对话框,因此您会收到错误,因为onceBut
您mainWindow
不在onceDlg
对话框中。
解决方案:正如@Radio 所说 - Qt 中组件之间的通信通常使用信号和插槽完成,但这不是唯一的方法。更简单的方法是简单地将主窗口传递给对话框窗口,这样您就可以在对话框窗口内使用它的按钮或任何您想要的东西进行操作。在下一个示例中,我在 line 中完成了该操作dialog = Dialog(self)
, whereself
指的是MainWindow
并且它被用作mainWin
inside Dialog
。运行它,单击第一个按钮,将显示对话框,单击save
对话框中的按钮,主中的第二个按钮将被更改和禁用。我希望我对你有所帮助。
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_())