如何隐藏QT应用中打开的Windows终端



首先,有类似的问题,但我认为这是一个不同的问题,因为仅当我调用 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

最新更新