如何隐藏在Qt应用程序中打开的Windows Terminal?

时间:2019-05-08 10:27:09

标签: c++ windows qt mingw-w64

首先,存在类似的问题,但我认为这是一个不同的问题,因为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")会打开。

1 个答案:

答案 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