C++ 如何隐藏在Qt应用程序中打开的windows终端?

C++ 如何隐藏在Qt应用程序中打开的windows终端?,c++,windows,qt,mingw-w64,C++,Windows,Qt,Mingw W64,首先,有类似的问题,但我认为这是一个不同的问题,因为Windows终端只在我调用system()时出现,而不是在应用程序启动时出现 我有一个用QC++编写的GUI程序,用一个 .PRO/文件,使用MIW编译器编译。操作系统是虚拟机箱中的Windows 10 我在Ubuntu中编写了代码,在那里它可以正常工作(根本看不到操作系统终端),但现在我正在Windows中测试它。我的问题是,每当我在代码中调用system()或类似程序来执行另一个程序(假定是在后台),Windows都会在我的gui前面打开

首先,有类似的问题,但我认为这是一个不同的问题,因为Windows终端只在我调用
system()
时出现,而不是在应用程序启动时出现

我有一个用QC++编写的GUI程序,用一个<代码> .PRO/<代码>文件,使用MIW编译器编译。操作系统是虚拟机箱中的Windows 10

我在Ubuntu中编写了代码,在那里它可以正常工作(根本看不到操作系统终端),但现在我正在Windows中测试它。我的问题是,每当我在代码中调用
system()
或类似程序来执行另一个程序(假定是在后台),Windows都会在我的gui前面打开一个cmd终端。我的程序中有很多这样的调用,因此在运行时有很多这样的窗口弹出或消失

我将main()设置为WinMain(),并从qmake配置中删除了控制台,但这并没有显示任何效果

我的
.pro
文件(删除的注释):

生成命令(由QtCreator生成):

C:\Qt\Qt5.12.3\5.12.3\mingw73\u 64\bin\qmake.exe C:\Users\dev\Documents\regionfind gui\regionfind-gui.pro-spec win32-g++&C:/Qt/Qt5.12.3/Tools/mingw730\u 64/bin/mingw32-make.exe qmake\u all

我该如何摆脱这些终端窗口?当命令没有任何输出时,它们不会打开,但我无法抑制常规输出或类似输出,因为在某些情况下,我使用以下代码存储输出并将其打印到gui中:

数组缓冲区;
字符串结果=getDescription(getStep())+命令+“\n”;
唯一的ptr管道(popen(command.c_str(),“r”),pclose);
如果(!pipe)抛出std::runtime_错误(“popen()失败”);
while(fgets(buffer.data()、buffer.size()、pipe.get())!=nullptr){
结果+=检查输出(buffer.data());
getGui()->txtOutput->append(QString::fromStdString(removeNewlineAtEnd(buffer.data()));
getGui()->txtOutput->repaint();

cout您可以使用
QProcess
类:

QObject*父对象;
...
QString program=“driverquery”;
QProcess*myProcess=新的QProcess(父进程);
myProcess->start(程序);
如果(myProcess->waitForStarted(-1)){
而(myProcess->waitForReadyRead(-1)){
getGui()->txtOutput->append(myProcess->readAllStandardOutput());
}
}
//否则报告错误或其他什么
在使用命令应用程序的情况下,可以执行以下操作:

QObject*父对象;
...
QString program=“driverquery”;
QProcess*myProcess=新的QProcess(父进程);
QString命令=QString(“cmd.exe%1\%2\).arg(“/C”).arg(程序);
myProcess->start(命令);
如果(myProcess->waitForStarted(-1)){
而(myProcess->waitForReadyRead(-1)){
getGui()->txtOutput->append(myProcess->readAllStandardOutput());
}
}
//否则报告错误或其他什么

很抱歉重新发布。我删除了我的第一次尝试,因为我认为错误在其他地方,但它不是,所以现在再次发布。它是为所有保持打开的命令打开一个终端,还是为每个命令打开一个终端?@nwp每次调用都会打开一个新的终端,并且在命令结束后关闭。转换到
QP可能有意义进程
这样您就可以知道生成的进程会发生什么情况,而不必猜测它们是否成功。它还绕过了控制台问题。我会看一看,谢谢。我正在摆弄它,目前它在
启动(程序)时崩溃
,可能是因为我还没有掌握父对象的挂起。我将进一步尝试并让您知道。使用
QProcess::execute(…)静态执行
可以工作,但缺少输出的返回。我将
QObject*parent;
放在这里是为了说明如何使用父对象,可能是QMainWindow。因此必须初始化
新的QProcess()
driverquery.exe是一个控制台应用程序。默认情况下,通过
CreateProcessW
将标准I/O重定向到管道运行该应用程序仍将分配控制台并创建窗口,除非采取步骤抑制控制台窗口(即
create\u NO\u窗口
创建标志)或者使用进程
STARTUPINFO
隐藏它。
QProcess
在重定向标准I/O时默认情况下是否抑制或隐藏控制台窗口?我进行了编辑,向您展示了如何使用控制台命令。exe@Gasteizko它可以工作,但仍然打开命令窗口。现在它们是空的,而不是显示输出,但它们仍然在那里.
QT       += core gui

CONFIG -= console
QMAKE_CXXFLAGS += -std=c++11

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = regionfind-gui
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp \
        regionfind.cpp \
        sagacmd.cpp

HEADERS += \
        regionfind.h \
        sagacmd.h \
        processingsteps.h
FORMS += \
        regionfind.ui

RESOURCES += \
        images.qrc