首先,存在类似的问题,但我认为这是一个不同的问题,因为Windows终端仅在我调用system()
时出现,而不是在应用程序一般启动时出现。
我有一个程序,使用MinGW编译器,该程序的GUI用Qt用C ++编写,并用.pro
文件用qmake内置。操作系统是Windows 10虚拟机。
我在Ubuntu上编写了可以按预期工作的代码(根本没有可见的OS终端),但是现在我正在Windows中对其进行测试。我的问题是,每当我在代码中调用system()
或类似代码以执行另一个程序(可能在后台)时,Windows都会在GUI前面打开一个cmd终端。我的程序中有很多这样的调用,因此在运行时会有很多这样的窗口弹出和消失。
我将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:\Qt\Qt5.12.3\5.12.3\mingw73_64\bin\qmake.exe C:\Users\dev\Documents\regionfind-gui\regionfind-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:\\Users\dev\\Documents\\testfolder")
不会打开窗口(无输出),但是system("driverquery")
会打开。
答案 0 :(得分:2)
您可以使用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