Как скрыть Windows Terminal, открытый в приложении Qt? - PullRequest
1 голос
/ 08 мая 2019

Прежде всего, есть похожие вопросы, но я думаю, что это другой вопрос, потому что терминал Windows появляется только тогда, когда я звоню system(), а не когда приложение запускается вообще.

У меня есть программа с графическим интерфейсом, написанная на C ++ с Qt и встроенная в qmake с файлом .pro, с использованием компилятора MinGW. ОС - это Windows 10 в виртуальной коробке.

Я написал код в Ubuntu, где он работает, как задумано (нет терминала ОС, видимого вообще), но сейчас я тестирую его в Windows. Моя проблема в том, что всякий раз, когда я вызываю system() или что-то подобное в моем коде для выполнения другой программы (предположительно в фоновом режиме), Windows открывает терминал 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

Как мне избавиться от этих окон терминала? Они не открываются, когда команда не имеет никакого вывода, но я не могу подавить общий вывод или подобное, потому что в некоторых случаях я сохраняю вывод и печатаю его в моем графическом интерфейсе, используя следующий код:

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 Ответ

2 голосов
/ 08 мая 2019

Вы можете сделать это, используя класс 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
...