งานคือการเขียนแอปพลิเคชัน Qt Quick (GUI) เพื่ออัปโหลดเฟิร์มแวร์ใหม่ไปยังตัวควบคุมแบบสัมผัส
ซอฟต์แวร์อัปโหลดจัดทําโดยผู้ผลิตใน แอปพลิเคชัน .exe ที่โหลดไฟล์.bin ลงในตัวควบคุมแบบสัมผัส
ฉันต้องการใช้คลาส Qt "QProcess" ซึ่งสามารถใช้เพื่อเรียกและควบคุมแอปพลิเคชันเชลล์ได้ ในด้าน Linux ฉันได้ใช้สิ่งนี้สําเร็จหลายครั้งแล้ว - แต่บน Windows มันใช้งานไม่ได้ในตอนแรก
QProcess::setWorkingDirectory
"เคล็ดลับ" หรือวิธีแก้ปัญหาสําหรับสิ่งนี้คือการใช้ "setWorkingDirectory" นี่คือข้อความที่ตัดตอนมาจากไฟล์. h และ .cpp โปรดทราบบรรทัด "process->setWorkingDirectory..." ในไฟล์ .cpp
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:>