1

您好,我正在使用 python 2.7 开发数据存档程序。我有一个主窗口,并且有一些元素(按钮、文本行等)。单击一个按钮打开一个对话框表单页面。用户在该对话框页面上选择他们的答案。对话框页面有一个名为“保存”的按钮。单击保存按钮对话框类时,将用户的选择保存到数据库。我想做的是,当用户单击对话框上的保存按钮时,它将启用 mainWindow 上未启用的某些元素。我正在使用这些代码进入对话框类并保存按钮功能:

self.ui.onceBut.setEnabled(True) 等

但我犯了一个错误:

AttributeError:“onceDlg”对象没有属性“onceBut”

onceDlg 是对话框页面类名。

我该如何解决这个问题,我可以做我想做的事?提前致谢。

4

1 回答 1

0

selfinself.ui.onceBut.setEnabled(True)指的是对话框,因此您会收到错误,因为onceButmainWindow不在onceDlg对话框中。

解决方案:正如@Radio 所说 - Qt 中组件之间的通信通常使用信号和插槽完成,但这不是唯一的方法。更简单的方法是简单地将主窗口传递给对话框窗口,这样您就可以在对话框窗口内使用它的按钮或任何您想要的东西进行操作。在下一个示例中,我在 line 中完成了该操作dialog = Dialog(self), whereself指的是MainWindow并且它被用作mainWininside 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_())
于 2013-08-20T08:45:37.917 回答