我有以下代码,使用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 Application
是QCoreApplication
,并且它不像我正常运行它那样产生终端窗口。监视可执行文件的进度是很有用的,那么如何让我的应用程序运行新程序并显示终端窗口?
编辑可能的重复技术上回答了这个问题,但我已经用一个有效的解决方案回答了这个问题。
答案 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;标志。
我最终做了什么:
P.S。
如果您需要使用&#34; SubSystem:CONSOLE&#34;,请务必致电&#34; FreeConsole &#34;在致电&#34; AllocConsole &#34;之前。这是必需的,因为默认情况下子进程将使用父进程控制台...