以编程方式干净地关闭 qt Gui 应用程序

Cleanly closing a qt Gui application application programatically

您好,我一直在 windows 上使用 PyQt 4.8 创建一个简单的图形用户界面应用程序。 gui(main window) 有一个按钮和一个 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 命令行中的 运行。即如果用户输入

Run 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_())

基本上,如果使用参数调用应用程序,我不会 want/need 显示 gui,只需调用处理函数。处理完成后干净退出

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

我的问题是如何以编程方式退出应用程序?这样一旦完成它就会干净地自行关闭。

我已经尝试过

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

sys.exit(app.exec_())

来自代码的其他部分,现在它只是崩溃,因为它处理文件然后立即崩溃。经常崩溃。

关于从命令行调用应用程序时如何干净利落地正常关闭的任何建议?

对 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 class 没有 quit/exit 方法(至少在 C++ 中)。

如果您不需要显示 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.

或者,如果您确实需要创建主 window 的实例并且您绝对需要事件循环,只需确保在最后调用 window 上的 .close的方法。默认情况下,QApplication 应该在没有 windows 处于打开状态时退出。

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