Eseguire comandi in Qt con QProcess

Mattepuffo's logo
Eseguire comandi in Qt con QProcess

Eseguire comandi in Qt con QProcess

QProcess è la classe per Qt preposta all'esecuzione di comandi esterni.

Oggi vediamo come usarla, e nello specifico:

  • eseguiremo un comando
  • cattureremo lo stanard input visualizzandolo su una QPlainTextEdit
  • cattureremo lo stanard error visualizzandolo su una QPlainTextEdit

Così facendo vedremo l'output del comando in tempo reale.

Non vi posto tutta la classe della finestra, ma vi posto solo quello che serve allo scopo.

Nel file di intestazione avremo sicuramente:

private slots:
    void execSync(QString cmd);
    void readOutput();
    void readError();

private:
    QPlainTextEdit *resEdit;

Per quanto riguarda i tre metodi:

  • execSync esegue il comando (passato come parametro)
  • readOutput legge lo standard output
  • readError legge lo standard error

Questa l'implementazione:

void MainWindow::execSync(QString cmd) {
    QProcess *process = new QProcess;
    if (process) {
        process->setEnvironment(QProcess::systemEnvironment());
        process->setProcessChannelMode(QProcess::MergedChannels);
        process->start(cmd);
        process->waitForStarted();
        connect(process, &QProcess::readyReadStandardOutput, this, &MainWindow::readOutput);
        connect(process, &QProcess::readyReadStandardError, this, &MainWindow::readError);
    }
}

void MainWindow::readOutput() {
    QProcess *process = dynamic_cast(sender());
    if (process) {
        resEdit->appendPlainText(process->readAllStandardOutput());
    }
}

void MainWindow::readError() {
    QProcess *process = dynamic_cast(sender());
    if (process) {
        QPalette p = resEdit->palette();
        p.setColor(QPalette::Text, Qt::red);
        resEdit->setPalette(p);
        resEdit->appendPlainText(process->readAllStandardError());
    }
}

Come vedete usiamo due connect per legare lo standard output  / error alle due funzioni sotto.

Queste non fanno altro che leggere i dati e indirizzarli sulla QPlainTextEdit:

  • readAllStandardOutput
  • readAllStandardError

Alla fine è più facile di quello che sembra.

Enjoy!


Condividi

Commentami!