HMI
Windows .exe uitvoeren in Qt-toepassing

De taak was om een Qt Quick-applicatie (GUI) te schrijven om nieuwe firmware te uploaden naar een touch controller. De fabrikant heeft de uploadsoftware in een .exe-toepassing beschikbaar gesteld, die een .bin-bestand op de touch controller laadt. Ik wilde de Qt-Classes "QProcess" gebruiken, waarmee men shell-applicaties kan oproepen en besturen. Ik had dit al meerdere keren met succes gebruikt met Linux, maar in Windows wilde het eerst niet lukken. ## QProcess::setWorkingDirectory De "truc" of oplossing was om "setWorkingDirectory" te gebruiken. Hier volgt een fragment uit het .h- en .cpp-bestand. Let op de regel "process->setWorkingDirectory..." in het .cpp-bestand. cmdlauncher.h

#ifndef CMDLAUNCHER_H
#define CMDLAUNCHER_H

#include <QObject>
#include <QtQuick>
#include <QDebug>
#include <QProcess>
#include <QVariant>
#include <QString>
#include <QDir>

class CmdLauncher : public QProcess
{
    Q_OBJECT

public:
    CmdLauncher(QObject *parent = nullptr);

    Q_INVOKABLE void start(const QString &program, const QVariantList &arguments);

    QString application_directory;
};

#endif // CMDLAUNCHER_H

cmdlauncher.cpp

#include "cmdlauncher.h"

CmdLauncher::CmdLauncher(QObject *parent) : QProcess(parent)
{
    process_running = "start";
}

void CmdLauncher::start(const QString &program, const QVariantList &arguments) {
    QStringList args;

    // convert QVariantList from QML to QStringList for QProcess/
    for (int i = 0; i setWorkingDirectory(application_directory + "/nConsoleTool");
    process->setProcessChannelMode(QProcess::MergedChannels);
    process->start(program, args);
    process->waitForFinished();

    // get values and set states
    QByteArray bytes = process->readAll();
    cmd_output = QString::fromLocal8Bit(bytes);
    emit cmdOutputChanged();
    }
}
main.qml<
code3:>>