如何在PyQt中调用多个Dialog?

时间:2012-02-26 17:16:48

标签: python qt4 pyqt pyqt4

我有一个主对话框,在该对话框上有一个按钮。单击该按钮时,我想打开另一个对话框。

主对话框代码(在主对话框中单击按钮时调用的功能):

def add_host(self):
        x=add_host.Ui_Dialog1()
        x.main()

默认功能:

if __name__ == "__main__":
    import sys
    global app
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

辅助对话框(add_host.py)代码快照:

def main(self):
        app1 = QtGui.QApplication(sys.argv)
        Dialog1 = QtGui.QDialog()
        ui1 = Ui_Dialog1()
        ui1.setupUi1(Dialog1)
        Dialog1.show()
        sys.exit(app.exec_())

因此,当我运行代码时,它会打开辅助对话框,但当我关闭它时,它只是冻结,我收到此错误消息:

 File "testbot.py", line 175, in add_host
    x.main()
  File "/home/ppp/ppp/add_host.py", line 74, in main
    sys.exit(app.exec_())
NameError: global name 'app' is not defined

哪个有意义,但我不知道如何解决它。我尝试了几种组合但没有成功,包括添加和删除app.exec_()

2 个答案:

答案 0 :(得分:4)

您无法在同一脚本和线程中创建多个QApplications 。你应该只有一个......

这应该更像是:

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

没有全球应用。虽然您应该在对话框的类中进行setupUI。

然后,当您想要使用您的应用展示另一个对话框时...说main(),您只需创建它并拨打show()

这是一个非常基本的例子:

class Dialog(QDialog)
    def __init__(self, parent):
        super(Dialog, self).__init__(parent)
        self.otherDialog = QDialog(parent=self)

        self.otherDialog.show()


if __name__ == "__main__":
    app = QApplication([])
    dialog = Dialog()
    dialog.show()
    app.exec_()

您可以通过调用exec_()创建单个QApplication并启动其事件循环。从那时起,您的主应用程序可以自由创建更多QWidgets。此时,您再也不会再次创建另一个QApplication。

另外,我不明白你代码的这一部分:

def add_host(self):
    x=add_host.Ui_Dialog1()
    x.main()

您在UI对象上调用main()方法的事实使我认为您正在修改UI文件并向其添加功能,而您不应该这样做。每次在QT Designer中进行更改并保存一个新文件时,该ui文件都会被覆盖。您应该只导入它并使用其setupUI()方法将其应用于您自己的自定义类。

关于模块组织的说明

当您设计PyQT应用程序时,您将始终只有一个入口点可以启动您的应用程序。这是应该创建QApp并启动事件循环的唯一且唯一的位置,通常在if __name__ == "__main__"块中完成,以确保它仅在其主脚本时完成。它不应该在对象的方法中完成。对于您定义其他Dialog,Widgets等的所有其他模块,这些模块应该只是您导入的类。只要您有一个正在运行的QApp,您就可以自由地创建和显示这些小部件。

答案 1 :(得分:0)

你的代码示例有点令人困惑 - 我不明白为什么你有两个主电源等等 - 无论如何,也许这只是add_host.py(app1.exec_()而不是app.exec_())中的一个错字<) / p>

def main(self):
    app1 = QtGui.QApplication(sys.argv)
    ...
    sys.exit(app1.exec_())