Qt软件更新(三)

Qt软件更新(三)

这篇文章介绍软件在线更新的最后一部分“更新程序”。 实现功能:

复制更新内容到程序目录 删除更新目录 重启软件 #ifndef INSTALL_H #define INSTALL_H #include <QObject> #include <QProcess> class install : public QObject { Q_OBJECT public: explicit install(QObject *parent = nullptr); signals: void updateText(QString text); public slots: void startInstall(QStringList info); private: bool cpDir(const QString &srcPath, const QString &dstPath); void clearTempFiles(const QString& temp_path); QProcess *process = nullptr; }; #endif // INSTALL_H #include “install.h” #include <QDir> #include <QtDebug> #include <QSettings> #include <QTimer> #include <QApplication> #include <QDirIterator> install::install(QObject *parent) : QObject(parent) { process = new QProcess(this); }
<
void install::startInstall(QStringList info) { QString srcPath = info.at(1); QString dstPath = QDir::currentPath(); qDebug() << “install::startInstall ::” << srcPath; cpDir(srcPath,dstPath); QDir(srcPath).removeRecursively(); QString iniFilePath = QDir::currentPath() + “/config.ini”; QSettings settings(iniFilePath,QSettings::IniFormat); settings.beginGroup(“VersionDate”); settings.setValue(“time”, info.at(0)); // QTimer::singleShot(2000,this,[=](){ emit updateText(QString::fromLocal8Bit(“软件更新成功,将启动iLabV12”)); // QTimer::singleShot(2000,this,[=](){ process->setProcessChannelMode(QProcess::MergedChannels); QString exe = QDir::currentPath() + “/iLabV12.exe”; QDir::setCurrent(exe); qDebug() << “start exe:” << exe; // process->startDetached(“iLabV12.exe”); if (!process->startDetached(“iLabV12.exe”)) { qDebug() << “start failed:” << process->errorString(); emit updateText(QString::fromLocal8Bit(“启动iLabV12失败请手动开启”)); } else { qDebug() << “start success”; QApplication::quit(); } // }); // }); }
<
bool install::cpDir(const QString &srcPath, const QString &dstPath) { if(srcPath.isEmpty() || dstPath.isEmpty()) return false; QDir srcDir(srcPath); foreach(const QFileInfo &info, srcDir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)){ QString srcItemPath = srcPath + “/” + info.fileName(); QString dstItemPath = dstPath + “/” + info.fileName(); if(info.isDir()){ QDir dir; if (!dir.exists(dstItemPath)) { bool res = dir.mkpath(dstItemPath); if(!res) qDebug() << “mkpath error:” << res; } if(!cpDir(srcItemPath, dstItemPath)){ return false; } } else if(info.isFile()){ if(QFile(dstItemPath).exists()) { QFileInfo f(dstItemPath); f.dir().remove(f.fileName()); } if(!QFile::copy(srcItemPath, dstItemPath)){ return false; } } else{ qDebug() << “Unhandled item” << info.filePath() << “in cpDir”; } } return true; }
<
void install::clearTempFiles(const QString& temp_path) { QDir Dir(temp_path); if(Dir.isEmpty()) { return; } // 第三个参数是QDir的过滤参数,这三个表示收集所有文件和目录,且不包含”.”和”..”目录。 // 因为只需要遍历第一层即可,所以第四个参数填QDirIterator::NoIteratorFlags QDirIterator DirsIterator(temp_path, QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags); while(DirsIterator.hasNext()) { if (!Dir.remove(DirsIterator.next())) // 删除文件操作如果返回否,那它就是目录 { QDir(DirsIterator.filePath()).removeRecursively(); // 删除目录本身以及它下属所有的文件及目录 } } Dir.removeRecursively(); }

免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:Qt软件更新(三) https://www.yhzz.com.cn/a/13821.html

上一篇 2023-05-12
下一篇 2023-05-12

相关推荐

联系云恒

在线留言: 我要留言
客服热线:400-600-0310
工作时间:周一至周六,08:30-17:30,节假日休息。