Qt: Как отловить ошибку при системном вызове?

Я создаю приложение с графическим интерфейсом, где я делаю системный вызов и вызываю gnuplot для запуска скрипта. Теперь я хочу встроить сообщение об ошибке, в котором говорится, что что-то не так (например, gnuplot не установлен или находится на неверном пути).

Так что я думал о выпуске QMessageBox, но я не знаю, как я могу проверить, успешно ли выполнен системный вызов или нет.

if(//System call didn't work)
{
QMessageBox msgBox;
msgBox.setWindowTitle("Error");
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText("GNUPLOT was not installed");
msgBox.exec();
}

Мой системный вызов выглядит так:

system(gnuplot script.txt);

Какие-либо предложения?

6

Решение

Вы должны использовать QProcess а не низкоуровневый системный вызов, потому что это хорошая абстракция в базе кода Qt. В противном случае вы будете иметь дело с битами, специфичными для платформы. QProcess уже решает это для вас. Если вам подходит блокирующий подход, иначе. синхронизировать, вы могли бы написать что-то вроде этого кода ниже.

QProcess process;

process1.start("gnuplot arg1 arg2 etc");

// Wait for it to start
if(!process.waitForStarted())
return 0;

bool retval = false;
QByteArray buffer;
while ((retval = process.waitForFinished()));
buffer.append(process.readAll());

if (!retval) {
qDebug() << "Process 2 error:" << process.errorString();
msgBox.setText(buffer);
return 1;
}

Если вы не хотите блокировать во время работы вашего скрипта gnuplot, вы можете подключить слот или просто лямбду с C ++ 11 и далее к readyRead () сигнал. Конечно, вам также необходимо подключиться к ошибка() сигнал. Код без лямбды для работы со средами до C ++ 11 будет выглядеть примерно так:

GnuPlotReader::GnuPlotReader(QQProcess *process, QObject *parent)
: QObject(parent)
, m_process(process)
, m_standardOutput(stdout)
{
connect(m_process, SIGNAL(readyRead()), SLOT(handleReadyRead()));
connect(m_process, SIGNAL(error(QProcess::ProcessError)), SLOT(handleError(QProcess::ProcessError)));
connect(&m_timer, SIGNAL(timeout()), SLOT(handleTimeout()));

m_timer.start(5000);
}

GnuPlotReader::~GnuPlotReader()
{
}

void GnuPlotReader::handleReadyRead()
{
m_readData = m_process->readAll();

if (!m_timer.isActive())
m_timer.start(5000);
}

void GnuPlotReader::handleTimeout()
{
if (m_readData.isEmpty()) {
m_standardOutput << QObject::tr("No data was currently available for reading from gnuplot") << endl;
} else {
m_standardOutput << QObject::tr("GnuPlot successfully run")<< endl;
}

}

void GnuPlotReader::handleError(QProcess::ProcessError processError)
{
if (processError == QProcess::ReadError) {
m_standardOutput << QObject::tr("An I/O error occurred while reading the data, error: %2").arg(m_process->errorString()) << endl;
messageBox.setText(m_readData);
}
}
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]