Qt 实现简单的离线程序自动更新

1.软件安装目录保存在注册表中

离线程序自动更新,其本质是替换原来的.dll,.exe等文件,并保持文件名不变,或者新增部分文件。
以下是以同名文件替换为例:
1.首先需要知道软件的安装路径,这个可以在软件运行时,自动保存软件安装路径到注册表指定位置;
2.更新软件读取注册表对应的安装路径;
3.文件的删除与替换。

保存安装路径到注册表

	QString path = QCoreApplication::applicationFilePath();
    path.replace("/", "\\");

   
    QString readPath;
    // #define Reg_MyExe_Path  "HKEY_LOCAL_MACHINE\\SOFTWARE\\MyCompany"
    QSettings* settings = new QSettings(Reg_MyExe_Path, QSettings::NativeFormat);
    QVariant p = settings->value(exeName); // QString exeName = "MyExe";
    if (p.toString().isEmpty())
    {
        settings->setValue(exeName, path);
    }
    delete settings;

读取注册表软件安装目录

	 QString exePth;

    QSettings* settings = new QSettings(Reg_MyExe_Path, QSettings::NativeFormat);
    exePth = settings->value(exeName).toString();
    if (exePth.isEmpty())
    {
        QMessageBox::warning(this, "Warning", "软件更新失败!");
        return;
    }
    delete settings;

    qDebug() << "-----file path: " << exePth;

    QString oldFile, newFile,fname = "123.txt";
    oldFile = QFileInfo(exePth).absolutePath().append("%1%2").arg("/").arg(fname);
    newFile = QFileInfo("testFile/" + fname).absoluteFilePath();

    autoReplaceFile(oldFile, newFile);

测试demo界面

在这里插入图片描述

测试demo.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_testSoftUpdate.h"
#include <qsettings.h>  
#include <QFile>
#include <qfileinfo.h>
#include <qmessagebox.h>

#define Reg_MyExe_Path  "HKEY_LOCAL_MACHINE\\SOFTWARE\\MyCompany"

#if _MSC_VER >= 1600 

#pragma  execution_character_set("utf-8")

#endif
class testSoftUpdate : public QMainWindow
{
    Q_OBJECT

public:
    testSoftUpdate(QWidget *parent = Q_NULLPTR);

private slots:
    void on_btnSave_clicked();
    void on_btnUpdate_clicked();

private:
    Ui::testSoftUpdateClass ui;
    QString exeName = "MyExe";

    void autoReplaceFile(const QString& oldfile, const QString& newfile);
};

测试demo.cpp

#include "testSoftUpdate.h"
#include <qdebug.h>

testSoftUpdate::testSoftUpdate(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

void testSoftUpdate::on_btnSave_clicked()
{
    QString path = QCoreApplication::applicationFilePath();
    path.replace("/", "\\");

   
    QString readPath;
    QSettings* settings = new QSettings(Reg_MyExe_Path, QSettings::NativeFormat);
    QVariant p = settings->value(exeName);
    if (p.toString().isEmpty())
    {
        settings->setValue(exeName, path);
    }
    delete settings;
}
void testSoftUpdate::on_btnUpdate_clicked()
{
    QString exePth;

    QSettings* settings = new QSettings(Reg_MyExe_Path, QSettings::NativeFormat);
    exePth = settings->value(exeName).toString();
    if (exePth.isEmpty())
    {
        QMessageBox::warning(this, "Warning", "软件更新失败!");
        return;
    }
    delete settings;

    qDebug() << "-----file path: " << exePth;

    QString oldFile, newFile,fname = "123.txt";
    oldFile = QFileInfo(exePth).absolutePath().append("%1%2").arg("/").arg(fname);
    newFile = QFileInfo("testFile/" + fname).absoluteFilePath();

    autoReplaceFile(oldFile, newFile);
}

void testSoftUpdate::autoReplaceFile(const QString& oldfile, const QString& newfile)
{

    qDebug() << "-----oldfile path: " << oldfile << ", newfile path : " << newfile;

    QFile f;
    if (f.remove(oldfile))
    {
        QMessageBox::warning(this, "Warning", "请先关闭软件!");
        return;
    }
    _sleep(20);
      

    if (f.copy(newfile, oldfile))
    {
        qDebug() << "-----copy succeed ! --------";
        QMessageBox::information(this, "通知", "软件已更新完成!");
    }
    else
    {
        QMessageBox::warning(this, "Warning", "请先关闭软件!");
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: qtquick 是一种快速开发应用程序的框架,其中包含了各种各样的组件和模板,方便开发人员进行快速的应用开发。qtquick 通过其强大的绘图能力可以用来实现离线地图。 首先,我们可以利用 qtquick 提供的图形化编程界面设计地图的视图,包括地图的初始位置、缩放比例、地图标记和附近的公共设施等等。然后,我们可以加载本地的地图缓存文件,比如我们可以下载一些开源的地图缓存文件并存储在本地,然后在地图控件中设置加载本地文件的路径,这样即可实现离线地图的显示。 不仅如此,利用 qtquick 进行地图开发还可以实现定位、导航等功能,我们可以在地图上设置一个位置标记控件,实时更新用户的位置信息。同时,我们可以利用 qtquick 提供的网络模块加载实时的天气信息或交通状况,提供更加细致的地图服务。 需要注意的是,离线地图的开发需要先下载地图缓存文件,所以开发者需要在应用程序内提供下载缓存文件的功能,同时,地图缓存文件的更新和存储也需要进行定期管理。但是qtquick提供了较好的兼容性及良好的UI效果,使开发者可以快速实现离线地图的开发需求。 ### 回答2: QtQuick是Qt中用于构建图形界面的框架,它可以通过QML语言轻松实现各种UI效果。为了实现离线地图功能,我们可以利用Qt中的QML与C++结合的方式进行开发。 首先,在C++中使用QGeoTiledMappingManager引擎加载离线瓦片图层,这个类本身是可以支持加载在线瓦片图层。但是在加载离线瓦片时,可以自己实现缓存机制,避免多次读取离线瓦片。 然后,在QML中引用这个C++类并通过QML属性将地图上的视图坐标映射为地理坐标,同时地图上的图标、线、面等元素可以通过QML的Canvas来实现。通过绑定和交互,我们可以获得用户在地图上的操作,实现缩放、拖拽地图,地图上标点、画线等操作。 此外,为了提升地图效率和交互体验,还可以通过QQuickFramebufferObject来实现自定义地图渲染,利用显卡进行加速。 综上,QtQuick结合C++可以快速实现离线地图功能,并借助Qt的丰富生态,可以轻松扩展到网络请求、数据存储等不同场景。 ### 回答3: 随着移动设备的普及,使用离线地图的需求越来越大。在Qt框架中,QtQuick是一种轻量级的用户界面呈现技术,非常适合开发移动应用程序实现离线地图的过程可以通过以下几个步骤: 1. 获取地图数据 首先,需要获取离线地图数据。可以通过访问地图供应商的API获取数据,例如OpenStreetMap或Google Maps。然而,有些供应商可能需要支付费用才能使用API,而且有些很难获取。因此,如果需要使用免费的地图数据,你可以选择在OpenMapTiles等网站下载离线地图的数据。 2. 解析地图数据 获取地图数据后,需要使用Qt的API来解析它们,然后将它们转换为QtQuick中使用的格式。通常,地图数据包含在大型文件中,如GeoJSON或MBTiles。为了快速适配数据,可以使用QGeoJson或MBTiles格式,并使用QML中的Model来加载它们。 3. 使用QtQuick绘制地图 重要的一步是使用QtQuick中的MapType和Map对象来显示地图。QtQuick的MapType对象表示要显示的地图类型,如卫星影像或路线图。同时,Map对象是地图的主容器,控制它的平移和缩放。 4. 添加地图覆盖层 QtQuick还允许添加自定义图层到地图上,如标记点、线条、多边形或文字注释。这允许在地图上添加个性化信息或强化视觉效果。可以使用Image或Item组件制作标记点、方块或其他形状的图层,并使用QtQuick中的Canvas来绘制线条、多边形或自定义形状。 总之,使用QtQuick实现离线地图是一个高效而灵活的方法,可以使应用程序更加可扩展。可以使用QtQuick的API和组件以易于维护和更新的方式访问和处理地图数据。此外,QtQuick提供了灵活的功能,在创建高效可观察的应用程序时非常具有优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值