Windows GUI以及控制台应用程序

时间:2016-08-12 14:38:48

标签: c++ windows qt

我有一个应用程序,我希望能够在没有参数和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似乎不知道这一点 所以任何人都可以告诉我在那里做什么样的清理?

3 个答案:

答案 0 :(得分:1)

您的申请出现的原因"卡住"是因为它还没有真正退出,它仍然在你通过调用app.exec()开始的事件循环中

问题的解决方案取决于您是否需要控制台版本中的信号和插槽。

  1. 如果您不需要信号/广告位,请不要致电app.exec();,只需退回退出代码。

  2. 如果您确实需要信号/插槽,请向您的应用程序发出一个退出信号,让它知道应该退出该循环。

答案 1 :(得分:0)

作为一种解决方法,我通过将工作目录写为stdout的提示来修复它。
可能kludge将写入工作目录作为stdout的提示。

out << QDir::toNativeSeparators(QDir::currentPath()) + ">" << flush;

答案 2 :(得分:-1)

它确实返回到输入状态,只有CMD不知道它应该重新打印提示 - 它怎么知道,因为它没有运行控制台应用程序?

基本上,你需要做的是诱使用户相信它处于输入状态。您可以将CR发送到cmd以强制它重新打印到命令行,或者您可以嗅探提示并自己生成一个。