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

How to hide windows Terminal opened in Qt app?

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

我有一个带有 gui 的程序,它是用 C++ 和 Qt 编写的,并使用 MinGW 编译器在带有 .pro 文件的 qmake 中构建。 OS 是 Windows 10 在虚拟框中。

我在 Ubuntu 中编写代码,它按预期工作(根本看不到 OS 终端),但现在我正在 Windows 中测试它。我的问题是,每当我在我的代码中调用 system() 或类似代码来执行另一个程序(据说在后台)时,Windows 在我的 gui 前面打开一个 cmd 终端。我的程序中有很多这样的调用,因此在运行时有很多这样的 windows 弹出和消失。

我将 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.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

如何摆脱这些终端windows?当命令没有任何输出时它们不会打开,但我无法抑制一般输出或类似输出,因为在某些情况下我正在存储输出并将其打印到我的 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") 不会打开 window(无输出)但 system("driverquery") 会。

您可以使用 QProcess class:

    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