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

时间:2016-05-31 18:14:38

标签: qt python-2.7 pyqt qt4

您好我在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部分,现在它只是崩溃,因为它处理文件然后立即崩溃。非常一致的崩溃。

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

2 个答案:

答案 0 :(得分:0)

对PyQt并不熟悉,可能是您在处理功能方面做错了导致您的应用崩溃。

另外,如果您同步处理某些内容,则

  

app.quit()

之前调用

  

app.exec _()

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

如果你仍然需要在调用处理函数之前启动事件循环(即你在处理函数中使用事件循环),你可以像这样做一个怪癖(它是C ++,我&# 39;我不熟悉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 ++中)。

答案 1 :(得分:0)

如果您不需要显示GUI,您是否甚至需要运行QApplication事件循环?您可以将process_stuff_again设为staticmethod

class StartQt4App(...):
    @staticmethod
    def process_stuff_again(param):
        ...

app = QtGui.QApplication(sys.argv)
StartQt4App.process_stuff_again(param)

如果您未使用Qt中的任何process_stuff_again课程,则甚至无需创建QApplication

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

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