我有一个QApplication
,根据命令行参数,有时实际上没有GUI窗口,只是在没有GUI的情况下运行。在这种情况下,我希望在按下CTRL-C时优雅地关闭它。基本上,我的代码如下所示:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
... // parse command line options
if (no_gui) {
QObject::connect(&app, SIGNAL(unixSignal(int)),
&app, SLOT(quit()));
app.watchUnixSignal(SIGINT, true);
app.watchUnixSignal(SIGTERM, true);
}
...
return app.exec();
}
然而,这并不起作用。CTRL-C似乎被捕获(应用程序没有被杀死),但它也没有退出。我错过了什么?
5条答案
按热度按时间vulvrdjw1#
也许有一种方法可以在Qt上本地完成这一任务--在放弃之前,我浏览了一下QKeySequence文档,但您可以只使用
signal
。目前我的计算机上没有Qt/C++设置,但我有Python绑定。这样就可以工作了,当我按Ctrl-C时,应用程序将关闭。因此,我相信您的应用程序可以修改此代码,它将以如下方式结束:
不幸的是,我不能编译它,所以它可能需要一些修正,但这应该给予你一个大致的概念。通过使用
SIG_DFL
处理程序,你是在指示你的程序使用与Ctrl-C相关联的默认操作。a9wyjsp72#
由于没有文档说明,所以不应该使用
QApplication::watchUnixSignal
,而且,从阅读代码来看,当使用glib事件调度器(Linux上的默认值)时,它将无法正常工作。不过,一般来说,你可以在Qt应用程序中安全地捕获Unix信号,你只需要自己写一点代码,文档中甚至有一个例子-Calling Qt Functions From Unix Signal Handlers。
ktca8awb3#
您可以使用
QApplication::instance()
(或较短的宏版本qApp
),这两种宏至少从Qt4开始可用:guykilcj4#
除了Qt 4.0的一个行程序外,我没有找到更多关于
QApplication::watchUnixSignal
的文档;特别是在Qt的后续版本中没有记录。因此,看起来这个功能没有被宣传(因此也不应该)工作。虽然“Qt方式”显然很好,但我只是回到使用signal system call来代替。iyfamqjs5#
正如Jerkface Jones所提到的,在Linux上使用默认事件处理程序似乎不起作用。
如果Qt使用的是原始的Unix(non-glib)事件处理程序,Qt会立即在其信号处理程序中捕获并吸收^C,但unixSignal(int)信号只有在Qt完成事件处理后才会发出。
如果您正在运行代码(而不是无所事事地等待Qt发送信号),那么您需要调用QApplication::processEvents()让Qt发送信号。