【问题标题】:QProcess doesn't show the command windowQProcess 不显示命令窗口
【发布时间】:2017-08-09 15:00:23
【问题描述】:

我有以下代码使用QProcess 运行可执行文件。代码运行良好,新的可执行文件运行良好。

QString fileName = ui.textBrowser_csvFile->toPlainText();
QString tableName = ui.textBrowser_2->toPlainText();

QString program = "resources/myExe.exe";
QStringList arguments;
arguments << tableName << fileName;

bool res = QProcess::startDetached(program, arguments);

这是一个使用QCoreApplicationQt Console Application,它不会像我正常运行它那样产生终端窗口。监控可执行文件的进度会很有用,那么如何让我的应用程序运行新程序并显示终端窗口?

编辑可能的重复确实技术上回答了这个问题,但我已经用一个可行的解决方案回答了这个问题。

【问题讨论】:

标签: c++ qt


【解决方案1】:

正如 cmets 关于我的问题 this StackOverflow 帖子中所讨论的那样,使用 startDetached() 函数时这实际上是正确的行为。

我不完全确定该问题的答案建议做什么,但这是我的工作解决方案。

system() 是 Windows 特定功能,“如果操作系统允许,可以执行任何可以在终端上运行的命令”link

如果我替换这一行:

 bool res = QProcess::startDetached(program, arguments);

使用以下,然后它的工作原理:

system(QString("D:\\Qt\\5.9.1\\msvc2017_64\\bin\\myApp.exe " +tableName +" " + fileName).toStdString().c_str());

在短期内,我只是简单地将这个应用程序移到 Qt 文件夹中,因为它需要 DLL,但是通过这个应用程序的适当版本,您可以从任何地方运行它,包括从运行它的应用程序旁边。

然后我得到一个终端窗口,我的应用程序运行正常。

【讨论】:

    【解决方案2】:

    当从 Qt 5.7.0.0(x86) 迁移到 5.10.0.0(x64) 时,我真的很惊讶地看到,使用新的 Qt 版本,一个孩子(以“QProcess::startDetached”启动) 进程不会显示它的控制台(即使它是控制台应用程序!(SubSystem:CONSOLE)

    有关“AllocConsole”的 MS 文档说:

    控制台应用程序使用控制台初始化,除非它们是 创建为分离的进程(通过调用 CreateProcess 函数 带有 DETACHED_PROCESS 标志)。

    https://docs.microsoft.com/en-us/windows/console/allocconsole

    如果创建控制台进程,它们不会附加到控制台 使用带有 DETACHED_PROCESS 的 CreateProcess

    https://docs.microsoft.com/en-us/windows/console/creation-of-a-console

    所以我假设新的 Qt 版本正在使用带有“DETACHED_PROCESS”标志的“CreateProcess”。

    我最终做了什么:

    • 对于子进程,我现在使用“SubSystem:WINDOWS”。 (真的 重要)
    • 在子进程中,我正在使用“AllocConsole()”创建新控制台
    • 使用:“freopen("CONOUT$", "w", stderr);"和 "freopen("CONOUT$", "w", stdout);" (如果您想捕获 qDebug、qInfo 等,“stderr” 非常重要...)

    附:

    如果您需要使用“SubSystem:CONSOLE”,请务必在调用“AllocConsole”之前调用“FreeConsole”。这是必需的,因为默认情况下子进程将使用父进程控制台...

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多