python中主窗口与dialog的通信

2024-10-02 12:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我正在用python2.7编写数据归档程序。我有一个主窗口,有一些元素(按钮,文本行等)点击一个按钮打开一个对话框表单页面。用户在对话框页面上选择答案。对话框页面有一个名为“保存”的按钮。当单击“保存”按钮时,对话框类将用户的选择保存到数据库中。我想做的是,当用户点击对话框上的保存按钮时,它会在主窗口上启用一些未启用的元素。我用这些代码进入对话框类和保存按钮函数来执行此操作:

在self.ui.onceBut.setEnabled(True)等

但我犯了个错误:

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

onceDlg是dialog pages类名。在

我怎样才能解决这个问题,我能做我想做的事?提前谢谢。在


Tags: 数据函数答案代码用户文本程序数据库
1条回答
网友
1楼 · 发布于 2024-10-02 12:26:31

self.ui.onceBut.setEnabled(True)中的self引用了对话框,因此您得到了错误,因为您的onceButmainWindow中,而不是在onceDlg对话框中。在

解决方案:正如@Radio所说,Qt中组件之间的通信通常使用信号和插槽来完成,但这不是唯一的方法。 更简单的方法是简单地将主窗口传递到对话框窗口,这样您就可以在对话框窗口内使用它的按钮或任何您想要的操作。在下一个例子中,我在dialog = Dialog(self)行中完成了这一点,其中self表示MainWindow,它在Dialog内用作mainWin。运行它,单击第一个按钮,对话框将显示,单击对话框中的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_())

相关问题 更多 >

    热门问题