以编程方式干净地关闭 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 任务管理器查看它)。
我的问题是如何以编程方式退出应用程序?这样一旦完成它就会干净地自行关闭。
我已经尝试过
- app.quit()
- app.exit()
- myapplication.exit()
- myapplication.quit()
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()
您好,我一直在 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 任务管理器查看它)。
我的问题是如何以编程方式退出应用程序?这样一旦完成它就会干净地自行关闭。
我已经尝试过
- app.quit()
- app.exit()
- myapplication.exit()
- myapplication.quit()
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()