【问题标题】:Cleanly closing a qt Gui application application programatically以编程方式干净地关闭 qt Gui 应用程序
【发布时间】:2016-09-29 21:19:54
【问题描述】:

您好,我一直在 Windows 上使用 PyQt 4.8 创建一个简单的 gui 应用程序。 gui(主窗口)有一个按钮和一个 QLineEdit 小部件。按下按钮只需调用一个函数来处理 QLineEdit 小部件的内容。 到目前为止,它运作良好。我的主要是这样的

class StartQt4App(QtGui.QMainWindow):

    def process_stuff(self,param):
        #Do stuff here


if __name__="__main__":
    app=QtGui.QApplications(sys.argv)
    myapplication=StartQt4App()
    myapplication.show()
    sys.exit(app.exec_())

使用 py2exe 我可以创建一个 Windows 可执行文件,例如 mygui_app.exe 但是我想对其进行调整,以便它可以从 Windows 命令行运行。即如果用户键入

运行 mygui_app.exe "c:\text_file.txt"

应用程序启动,这次没有 GUI,并自动处理调用应用程序时输入的参数。

到目前为止,这是我想出的

class StartQt4App(QtGui.QMainWindow):

    def process_stuff(self,param):
        #Do stuff here

    def process_stuff_again(self,param):
        #Do stuff here
        return


if __name__="__main__":
    if len(sys.argv)==1:

        app=QtGui.QApplications(sys.argv)
        myapplication=StartQt4App()
        myapplication.show()
        sys.exit(app.exec_())
    else:
        app=QtGui.QApplications(sys.argv)
        myapplication=StartQt4App()
        myapplication.process_stuff_again(param)
        sys.exit(app.exec_())

基本上,如果应用程序已使用我不想/不需要显示 gui 的参数调用,只需调用处理函数即可。处理完成后直接退出

目前它可以工作,至少就处理文件而言。但是,一旦处理完成,它就不会退出。相反,该程序保持活动状态(我可以使用 Windows 任务管理器看到它)。

我的问题是如何以编程方式退出应用程序?这样一旦完成,它就会彻底关闭。

我试过

  • app.quit()
  • app.exit()
  • myapplication.exit()
  • myapplication.quit()

没有工作,本质上该应用程序仍然存在并且正在运行。无奈之下,我删除了

sys.exit(app.exec_())

从代码的 else 部分开始,现在它只是崩溃了,因为它处理文件然后立即崩溃。经常崩溃。

关于如何干净地让应用程序在从命令行调用时很好地关闭有什么建议吗?

【问题讨论】:

    标签: qt python-2.7 pyqt qt4


    【解决方案1】:

    对 PyQt 不是很熟悉,可能是你的处理函数做错了,导致你的应用崩溃。

    此外,如果您同步处理某些内容,您的

    app.quit()

    之前调用过

    app.exec_()

    并且没有任何效果,因为事件循环(以 app.exec_() 开始)尚未开始。

    如果您仍然需要在调用处理函数之前启动事件循环(即您在处理函数中使用事件循环),您可以这样做(它是 C++,我不熟悉 PyQt) :

    #include <QCoreApplication>
    #include <QTimer>
    #include <QDebug>
    
    class MyApp : public QObject
    {
        Q_OBJECT
    public slots:
        void process()
        {
            qDebug() << "Processing...";
            qDebug() << "Quit application...";
            qApp->quit();;
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        MyApp myapp;
        QTimer::singleShot(0, &myapp, SLOT(process()));
        int rc = a.exec();
        qDebug() << "app finished with" << rc << "code";
    }
    
    #include "main.moc"
    

    另外,QMainWindow 类没有退出/退出方法(至少在 C++ 中)。

    【讨论】:

    • 我很确定这会转化为 PyQt,因为只需在调用 app.exec_() 的行之前添加行 QTimer.singleShot(0, app.quit)
    【解决方案2】:

    如果您不需要显示 GUI,您甚至需要运行 QApplication 事件循环吗?你可以把process_stuff_again 变成staticmethod

    class StartQt4App(...):
        @staticmethod
        def process_stuff_again(param):
            ...
    
    app = QtGui.QApplication(sys.argv)
    StartQt4App.process_stuff_again(param)
    

    如果您没有使用process_stuff_again 中的任何Qt 类,您甚至不需要创建QApplication

    或者如果你真的需要创建一个主窗口的实例并且你绝对需要事件循环,只要确保在方法结束时在窗口上调用.close。默认情况下,QApplication 应该在没有打开任何窗口时退出。

    def process_stuff_again(self, param):
        ...
        self.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      相关资源
      最近更新 更多