如何在 PyQt 中调用多个对话框?

Jac*_*ack 1 python qt4 pyqt pyqt4

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

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

def add_host(self):
        x=add_host.Ui_Dialog1()
        x.main()
Run Code Online (Sandbox Code Playgroud)

默认功能:

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_())
Run Code Online (Sandbox Code Playgroud)

辅助对话框(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_())
Run Code Online (Sandbox Code Playgroud)

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

 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
Run Code Online (Sandbox Code Playgroud)

这确实有道理,但我不知道如何解决。我尝试了几种组合都没有成功,包括添加和删除app.exec_().

jdi*_*jdi 5

您不能在同一个脚本和线程中创建多个 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_())
Run Code Online (Sandbox Code Playgroud)

没有全球应用。尽管您应该在对话框的类中进行 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_()
Run Code Online (Sandbox Code Playgroud)

您创建一个 QApplication 并通过调用exec_(). 从那时起,您的主应用程序可以自由地创建更多 QWidget。在这一点上,您永远不会再创建另一个 QApplication。

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

def add_host(self):
    x=add_host.Ui_Dialog1()
    x.main()
Run Code Online (Sandbox Code Playgroud)

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

关于模块组织的说明

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