Naloga je bila napisati Qt Quick aplikacijo (GUI) za nalaganje nove strojne programske opreme na krmilnik na dotik.
Programsko opremo za nalaganje je proizvajalec zagotovil v .exe aplikaciji, ki naloži .bin datoteko na krmilnik na dotik.
Hotel sem uporabiti Qt razrede "QProcess", ki se lahko uporabljajo za klic in nadzor shell aplikacij. Na strani Linuxa sem to že večkrat uspešno uporabil - na Windowsu pa sprva ni delovalo.

QProcess::setWorkingDirectory

»Trik« ali rešitev za to je bila uporaba »setWorkingDirectory«. Tukaj je odlomek iz datotek .h in .cpp. Prosimo, upoštevajte vrstico "process->setWorkingDirectory..." v .cpp datoteki.
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  arguments.length(); i++)
        args  arguments[i].toString();

    // start request or upload process
    QProcess * process = new QProcess();
    process->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

import QtQuick 2.9
import QtQuick.Window 2.3
import QtQuick.Controls 2.5
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.3
import CmdLauncher 1.0

ApplicationWindow {
    id: application_window
    visible: true
    width: 1024
    height: 768
    title: qsTr("Firmware Tool")

    CmdLauncher {
        id: launcher
    }

    Button {
        id: nUpdateFW
        x: 260
        y: 20
        width: 200
        height: 30
        text: "Upload Firmware"

        onClicked: {
            //console.log(launcher.application_directory + "/nConsoleTool/nUpdateFW.exe");
            if (file_path == "") {
                fileMissing.open();
            } else {
                launcher.start(launcher.application_directory + "/nConsoleTool/nUpdateFW.exe", [ file_path, "-ba" ]);
                if (launcher.controller_detected == false) {
                    controllerMissing.open();
                }
            }
        }
    }
}

</:code3:></:code2:></:code1:>

Walter Prechtl

Walter Prechtl

Posodobljeno na: 11. March 2024
Čas branja: 1 minute