Работа с exe файлом в Qt Creator C++

Не нашел подходящей информации в интернете, призываю к вашей помощи! К сути: Написал игру шахматы на С++ в Qt, теперь хочу подключить exe файл - шахматный движок. Идея в чем: после совершения хода координаты будут преобразовываться в формат "e2e4", сообщение такого формата должно быть написано в stockfish.exe (как раз таки движок, представляет из себя консоль), от него выводится ответное сообщение, в котором мой проект должен найти строчку "bestmove d2d4", и далее я уже реализую ход на доске d2d4, к примеру.

Вопрос, как это вообще реализовать, использовать QFile или QProcess, как правильно считать из exe приложения его вывод? Спасибовот пример запущеного exe файла


Ответы (1 шт):

Автор решения: Sergey Tatarincev

Как и было сказано вам нужно использовать QProcess, добавив обработку некоторых сигналов.

Предполагаем что на форме лежит plainTextEdit (сюда будем писать вывод программы), lineEdit (сюда будете вбивать команды) и pushButton (кнопка отправки команды).

MainWindow::MainWindow(QString p, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // На форме лежат:
    // QPlainTextEdit* plainTextEdit
    // QLineEdit* lineEdit
    // QPushButton* pushButton;
    // QProcess* ac - объявлен в mainwindow.h
    ac=new QProcess(this); // Создаем объект
    connect(ac, SIGNAL(readyReadStandardOutput()), this, SLOT(stdOut())); // привязываем слот стандартного вывода
    connect(ac, SIGNAL(readyReadStandardError()), this, SLOT(stdOut())); // Возможно и не понадобится, но привяжем и стандартный поток ошибок
    connect(ac, SIGNAL(finished(int)),this,SLOT(acFinished(int))); //привязываем слот к сигналу о завершении программы
    ac->start("cmd.exe",QStringList());   //Запустим программу
    ac->write("chcp 65001\n");  //пишем в стандартный ввод
    ac->waitForBytesWritten();

}
void MainWindow::stdOut()
{
    QByteArray tmp=((QProcess*)sender())->readAllStandardOutput(); //читаем что там навалилось в стандартном выводе
    if(!tmp.trimmed().isEmpty())
        ui->plainTextEdit->appendPlainText(QString::fromUtf8(tmp));
    tmp=((QProcess*)sender())->readAllStandardError(); //читаем что там навалилось в поток ошибок
    if(!tmp.trimmed().isEmpty())
        ui->plainTextEdit->appendHtml(QString("<font color='red'>%1</font>").arg(QString::fromUtf8(tmp)));

}

void MainWindow::acFinished(int exitCode)
{
    ui->plainTextEdit->appendHtml(QString("<b>exec done. exit code=%1</b>").arg(exitCode)); // Выводим сообщение что программа завершена

}

void MainWindow::on_pushButton_clicked()
{
    ac->write(ui->lineEdit->text().toUtf8().data());  //пишем в стандартный ввод
    ac->write("\n");
    ac->waitForBytesWritten();
}
→ Ссылка