首先,有类似的问题,但我认为这是一个不同的问题,因为仅当我调用 system()
而不是当应用程序启动时才会出现Windows终端。
我有一个用QT编写的GUI的程序,并使用Mingw编译器在.pro
文件中内置QMAKE。OS是虚拟框中的Windows 10。
我在Ubuntu中编写了代码,该代码按预期工作(根本看不到OS终端(,但是现在我正在Windows中对其进行测试。我的问题是,每当我调用system()
或在代码中类似地执行另一个程序(据说在后台(时,Windows都会在GUI前面打开一个CMD终端。我的程序中有很多这样的电话,因此在运行时会弹出很多此类窗口。
i将main((设置为winmain((,并从qmake配置中删除了控制台,但没有显示任何效果。
我的.pro
文件(删除评论(:
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
构建命令(由qtcreator生成(:
C:QtQt5.12.35.12.3mingw73_64binqmake.exe C:UsersdevDocumentsregionfind-guiregionfind-gui.pro -spec win32-g++ && C:/Qt/Qt5.12.3/Tools/mingw730_64/bin/mingw32-make.exe qmake_all
如何摆脱这些终端窗口?当命令没有任何输出时,它们不会打开,但是我不能抑制一般输出或类似的情况,因为在某些情况下,我使用以下代码将输出存储并将其打印到我的GUI中:
array<char, 128> buffer;
string result = getDescription(getStep()) + command + "n";
unique_ptr<FILE, decltype(&pclose) > pipe(popen(command.c_str(), "r"), pclose);
if(!pipe) throw std::runtime_error("popen() failed");
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += checkOutput(buffer.data());
getGui()->txtOutput->append(QString::fromStdString(removeNewlineAtEnd(buffer.data())));
getGui()->txtOutput->repaint();
cout << buffer.data() << flush;;
}
示例:system("mkdir C:\Usersdev\Documents\testfolder")
不打开窗口(没有输出(,但system("driverquery")
可以。
您可以使用QProcess
类:
QObject *parent;
...
QString program = "driverquery";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program);
if (myProcess->waitForStarted(-1)) {
while(myProcess->waitForReadyRead(-1)) {
getGui()->txtOutput->append( myProcess->readAllStandardOutput() );
}
}
// else report error or whatever
在使用命令应用程序的情况下,您可以执行以下操作:
QObject *parent;
...
QString program = "driverquery";
QProcess *myProcess = new QProcess(parent);
QString command = QString("cmd.exe %1 "%2 "").arg(" /C ").arg(program);
myProcess->start(command);
if (myProcess->waitForStarted(-1)) {
while(myProcess->waitForReadyRead(-1)) {
getGui()->txtOutput->append( myProcess->readAllStandardOutput() );
}
}
// else report error or whatever