我有一个应用程序,我希望能够在没有参数和GUI或作为控制台应用程序运行时存在参数。
int main(int argc, char *argv[])
{
if (argc > 1)
{
QCoreApplication app(argc, argv);
QTextStream out(stdout);
...
return app.exec();
}
else
{
QApplication app(argc, argv);
...
return app.exec();
}
}
这在linux下工作正常,但是Windows不允许我做任何控制台输出。在搜索问题后,我发现了AttachConsole()的提示并重新打开输出,所以我补充说:
FreeConsole();
AttachConsole(ATTACH_PARENT_PROCESS);
freopen("CON", "w", stdout);
freopen("CON", "w", stderr);
freopen("CON", "r", stdin);
这很好用,除了在应用程序返回后,commanline没有返回到"输入状态"。 澄清而不是:
C:\Users\x>
hello world
C:\Users\x>
它是这样的:
C:\Users\x>
hello world
应用程序正确退出,只是cmd似乎不知道这一点 所以任何人都可以告诉我在那里做什么样的清理?
答案 0 :(得分:1)
您的申请出现的原因"卡住"是因为它还没有真正退出,它仍然在你通过调用app.exec()
开始的事件循环中
问题的解决方案取决于您是否需要控制台版本中的信号和插槽。
如果您不需要信号/广告位,请不要致电app.exec();
,只需退回退出代码。
如果您确实需要信号/插槽,请向您的应用程序发出一个退出信号,让它知道应该退出该循环。
答案 1 :(得分:0)
作为一种解决方法,我通过将工作目录写为stdout的提示来修复它。
可能kludge将写入工作目录作为stdout的提示。
out << QDir::toNativeSeparators(QDir::currentPath()) + ">" << flush;
答案 2 :(得分:-1)
它确实返回到输入状态,只有CMD不知道它应该重新打印提示 - 它怎么知道,因为它没有运行控制台应用程序?
基本上,你需要做的是诱使用户相信它处于输入状态。您可以将CR发送到cmd
以强制它重新打印到命令行,或者您可以嗅探提示并自己生成一个。