Работа с exe файлом в Qt Creator C++
Не нашел подходящей информации в интернете, призываю к вашей помощи! К сути: Написал игру шахматы на С++ в Qt, теперь хочу подключить exe файл - шахматный движок. Идея в чем: после совершения хода координаты будут преобразовываться в формат "e2e4", сообщение такого формата должно быть написано в stockfish.exe (как раз таки движок, представляет из себя консоль), от него выводится ответное сообщение, в котором мой проект должен найти строчку "bestmove d2d4", и далее я уже реализую ход на доске d2d4, к примеру.
Вопрос, как это вообще реализовать, использовать QFile или QProcess, как правильно считать из exe приложения его вывод?
Спасибо
Ответы (1 шт):
Как и было сказано вам нужно использовать 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();
}