2017-08-09 275 views
1

我有以下代码,它使用QProcess运行exectuable。代码都运行正常,新的可执行文件运行,并没有问题。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); 

这是一个Qt Console Application使用QCoreApplication有像它会如果我正常运行它,它不产卵终端窗口。监视可执行文件的进度是非常有用的,所以如何让我的应用程序运行新程序并显示终端窗口?

编辑可能重复做技术上回答这个问题,但我已经回答与工作解决方案这个问题。

+0

这有帮助吗? https://stackoverflow.com/questions/42258892/qprocessstartdetached-not-show-console-window – Benp44

+0

可能重复的[QProcess :: startDetached()不显示控制台窗口](https://stackoverflow.com/questions/42258892/ qprocessstartdetached-not-show-console-window) – eyllanesc

+0

可能的,但是我认为我有比这个解决方案更好的答案,所以我会在下面发布它 – GPPK

回答

1

所以正如在我的问题的评论this中讨论的那样,StackOverflow post解释了当使用startDetached()函数时,这实际上是正确的行为。

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

system()是如果我更换这行“可以执行可以如果操作系统允许在终端运行任何命令” 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文件夹,因为它nee但是,如果DLL正确发布了这个应用程序,你可以从任何地方运行它,包括运行它的应用程序旁边的应用程序。

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

0

当从Qt的5.7.0.0(x86)的迁移到5.10.0.0(64)我真的很惊讶地看到,使用新的Qt版本,一个孩子(与推出“另外,QProcess :: startDetached”)过程将显示不出来它的控制台(即使它是一个控制台应用程序(子系统:CONSOLE)

关于 “AllocConsole” MS文档说:

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

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正在使用带有“DETACHED_PROCESS”标志的“CreateProcess”。

我已经结束了什么做:

  • 子进程我现在正在使用 “子系统:WINDOWS”。 (真的 重要)
  • 里面的子进程,我用创建新的控制台 “AllocConsole()”
  • 使用: “freopen函数(” CONOUT $”, “W”,标准错误 );”和“freopen(”CONOUT $“, ”w“,stdout);” ( “标准错误” 是,如果你想捕捉qDebug,QINFO,等真正重要的...)

附:

如果你需要使用 “子系统:CONSOLE”,一定叫 “AllocConsole” 之前调用 “FreeConsole”。这是必需的,因为子进程将默认使用父进程控制台...