QProcess不显示命令窗口

时间:2017-08-09 15:00:23

标签: c++ qt

我有以下代码,使用QProcess运行exectuable。代码都运行良好,新的可执行文件运行完全正常。

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);

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

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

2 个答案:

答案 0 :(得分:1)

正如我对问题的评论this中所讨论的那样,StackOverflow帖子解释说使用startDetached()函数时这是非常正确的行为。

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

system()是一个特定于Windows的函数,如果操作系统允许&#34;它可以执行任何可以在终端上运行的命令。 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,但是如果正确发布此应用程序,您可以从任何地方运行它,包括从运行它的应用程序旁边运行它。

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

答案 1 :(得分:0)

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

关于&#34; AllocConsole&#34;的MS文档表示:

  

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

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

  

如果创建了控制台进程,则它们不会附加到控制台   将CreateProcess与DETACHED_PROCESS一起使用

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

所以我假设新的Qt版本正在使用&#34; CreateProcess&#34;使用&#34; DETACHED_PROCESS&#34;标志。

我最终做了什么:

  • 对于子流程,我现在正在使用&#34; 子系统:WINDOWS &#34;。 (真 重要的)
  • 在子流程中,我使用&#34; AllocConsole ()&#34;创建新控制台。
  • 使用:&#34; freopen (&#34; CONOUT $&#34;,&#34; w&#34;, stderr );&# 34;和&#34; freopen (&#34; CONOUT $&#34;, &#34; w&#34;, stdout );&#34; (&#34; stderr &#34;如果您想捕获qDebug,qInfo等,这非常重要...)

P.S。

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