AAA红模仿

AAA红模仿 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

AAA红模仿 发布了文章 · 2月14日

Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789693

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:开发技术

上一篇:《Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo
下一篇:敬请期待...


前言

  开发Activex控件,以供其他应用程序调用,本篇章讲解Qt调用Activex控件,不限于Qt开发的Activex控件。


Demo

  在这里插入图片描述


QAxWidget

概述

  QAxWidget类是包装ActiveX控件的QWidget。
  QAxWidget可以实例化为空对象,带有它应该包装的ActiveX控件的名称,或者带有指向ActiveX控件的现有接口指针。ActiveX控件的属性、方法和事件仅使用QAxBase支持的数据类型,可以作为Qt属性、插槽和信号使用。基类QAxBase提供了一个API,可以通过IUnknown指针直接访问ActiveX。
  QAxWidget是一个QWidget,通常可以这样使用,例如,它可以组织在一个widget层次结构和布局中,或者充当一个事件过滤器。支持标准小部件属性,例如enabled,但它依赖于ActiveX控件来实现对环境属性(例如palete或font)的支持。QAxWidget试图提供必要的提示。
  但是,不能重新实现特定于Qt的事件处理程序,如mousePressEvent或keyPressEvent,并期望可靠地调用它们。嵌入式控件完全覆盖QAxWidget,通常处理用户界面本身。使用特定于控件的API(即侦听控件的信号),或使用标准COM技术,如window过程子类化。
  QAxWidget还从QAxBase继承了大部分与ActiveX相关的功能,特别是dynamicCall()和querySubObject()。
  警告:可以将QAxWidget子类化,但不能在子类中使用Q_OBJECT宏(生成的moc文件将不会编译),因此无法添加更多信号、插槽或属性。这种限制是由于运行时生成的元对象信息造成的。要解决此问题,请将QAxWidget聚合为QObject子类的成员。


Qt调用Activex方法

步骤一:注册activex控件

  运行之前先要注册,使用Qt下自带的idc注册一下。

idc -regserver activeHelloWorldDemo.dll

  在这里插入图片描述

步骤二:确认activeQt控件的clsid

  查看一下,打开注册表并搜索一下,确认clsid,如下图:
  在这里插入图片描述

"2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC"

步骤三:使用QAxWidget调用

QAxWidget *pAxWidget = new QAxWidget();
pAxWidget->resize(400, 320);
pAxWidget->setControl("2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC");
pAxWidget->show();


源码

#include <QApplication>
#include <QAxWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QAxWidget *pAxWidget = new QAxWidget();
    pAxWidget->resize(400, 320);
    pAxWidget->setControl("2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC");
    pAxWidget->show();

    return a.exec();
}


上一篇:《Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo
下一篇:敬请期待...

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 2月11日

Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113773009

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:开发技术

上一篇:无
下一篇:敬请期待...

前言

  使用C#开发动画,绘图性能跟不上,更换方案使用Qt开发Qt的控件制作成OCX以供C#调用,而activex则是ocx的更高级形式。
  QtCreator是没有Active控件项目的,所有需要使用VS,笔者使用VS2019开发。


准备工作

  Qt5.15.2 + VS2019 + vs tools,搭建基础开发环境不再赘述。
  在这里插入图片描述


开发第一个Qt Activex:Hello world

步骤一:新建Qt ActiveQt Server项目

  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述

步骤二:拖一个QLabel,输入”Hello world”

  在这里插入图片描述

步骤三:生成出现错误“MSB3073”

  在这里插入图片描述
  需要使用管理员权限打开VS2019软件。

步骤四:生成release和debug版本

  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述

步骤五:注册activex控件

  运行之前先要注册,使用Qt下自带的idc注册一下。

idc -regserver activeHelloWorldDemo.dll

  在这里插入图片描述

步骤六:调用activeQt控件

  查看一下,打开注册表并搜索一下,确认clsid,如下图:
   在这里插入图片描述
  创建一个html,然后输入如下内容:

<html>
<head>
<title>activeQtDemo</title>
</head>
<body>
    <object id="object" 
            classid="CLSID:2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC">    
    <!-- 以下为入坑了 -->
    <!--    classid="2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC">  -->    
            [Object not available! Did you forget to build and register the server?]
    </object>
</body>
</html>

  使用IE运行,active是微软特有的,其他浏览器不支持,如下图:
  在这里插入图片描述


入坑

入坑一:调用控件失败

问题

  在这里插入图片描述

原因

  因为classid的格式错误

解决

<html>
<head>
<title>activeQtDemo</title>
</head>
<body>
    <object id="object" 
            classid="CLSID:2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC">    
    <!-- 以下为入坑了 -->
    <!--    classid="2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC">  -->    
            [Object not available! Did you forget to build and register the server?]
    </object>
</body>
</html>

  在这里插入图片描述

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 2月7日

OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113541346

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

OSG与OsgEarth三维开发专栏

上一篇:《OsgEarth开发笔记(二):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(中)
下一篇:敬请期待...


前言

  上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。


OsgEarth编译过程简介

  OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。


目标:Qt5.15.x + VS2019 x64版本


演示Demo

  Demo基于Qt5.15.2 + vs2019 x64 + osg3.6.3 + osgEarth3.1。
  在这里插入图片描述
  演示环境Demo下载地址:https://download.csdn.net/download/qq21497936/14984791


编译OsgEarth 3.1

步骤一:下载解压

   在这里插入图片描述
  (备注:博主QQ群提供文件下载,博客首页有扫码加群)

步骤二:CMake配置,添加Curl

  在这里插入图片描述

补充:没有添加Curl,则会报错如下:

  在这里插入图片描述

步骤三:CMake配置,添加DGAL

   在这里插入图片描述

补充:没有添加GDAL,则会报错如下:

  在这里插入图片描述

步骤四:CMake配置,添加libZip

  在这里插入图片描述

补充:没有添加libzip,则会报错如下:

  在这里插入图片描述

步骤五:CMake配置,添加OSG

  在这里插入图片描述

步骤六:CMake配置

  在这里插入图片描述

步骤七:CMake生成工程

  在这里插入图片描述

步骤八:打开工程编译

  在这里插入图片描述

步骤九:编译错误“未定义GL_DYNAMIC_STORAGE_BIT”

  在这里插入图片描述
  直接自己加个定义把,先找到他的定义:
  在这里插入图片描述
  直接修改源码:
  在这里插入图片描述

步骤十:编译成功

  在这里插入图片描述
   在这里插入图片描述


Demo源码

#include <osg/Notify>
#include <osgGA/StateSetManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgDB/WriteFile>

#include <osgEarth/MapNode>
#include <osgEarth/GDAL>
#include <osgEarth/ExampleResources>
#include <osgEarth/EarthManipulator>

#include <osgEarth/Style>
#include <osgEarth/OGRFeatureSource>
#include <osgEarth/FeatureModelLayer>
#include <osgEarth/FeatureImageLayer>

using namespace osgEarth;
using namespace osgEarth::Util;

const char* styles_css =
R"(
    p {
        altitude-clamping: terrain-drape;
        render-backface-culling: false;
    }
    p1: p{ fill: #ff3f3f9f; }
    p2: p{ fill: #3fff3f9f; }
    p3: p{ fill: #3f3fff9f; }
    p4: p{ fill: #ff3fff9f; }
    p5: p{ fill: #ffff3f9f; }
)";

const char* script_source =
R"(
    function getStyleClass()
    {
        // Exclude any countries beginning with the letter A: 
        if ( feature.properties.name.charAt(0) === 'A' )
            return null;
                        
        // If it starts with the letter C, return an inline style:
        if ( feature.properties.name.charAt(0) == 'C' )
            return '{ _fill: #ffc838; stroke: #8f8838; extrusion-height: 250000; }';
                        
        // Otherwise, return a named style based on some calculations:
        var pop = parseFloat(feature.properties.pop);
        if      ( pop <= 14045470 )  return "p1";
        else if ( pop <= 43410900 )  return "p2";
        else if ( pop <= 97228750 )  return "p3";
        else if ( pop <= 258833000 ) return "p4";
        else                         return "p5";
    }
)";

int main(int argc, char** argv)
{
    osgEarth::initialize();

    osg::ArgumentParser arguments(&argc, argv);

    bool useRaster = arguments.read("--rasterize");
    bool useMem = arguments.read("--mem");
    bool useLabels = arguments.read("--labels");
    bool useDraping = arguments.read("--drape");
    bool useClamping = arguments.read("--clamp");
    bool useScript = arguments.read("--script");

    std::string outfile;
    arguments.read("--out", outfile);

    osgViewer::Viewer viewer(arguments);

    osg::ref_ptr<Map> map = new Map();

    GDALImageLayer* basemap = new GDALImageLayer();
    basemap->setURL("world.tif");
    map->addLayer(basemap);

    // Next we add a layer to provide the feature data.
    OGRFeatureSource* features = new OGRFeatureSource();
    features->setName("vector-data");

    if (useMem)
    {
        // the --mem options tells us to just make an in-memory geometry:
        Ring* line = new Ring();
        line->push_back(osg::Vec3d(-60, 20, 0));
        line->push_back(osg::Vec3d(-120, 20, 0));
        line->push_back(osg::Vec3d(-120, 60, 0));
        line->push_back(osg::Vec3d(-60, 60, 0));
        features->setGeometry(line);
    }
    else
    {
        features->setURL("world.shp");
    }
    map->addLayer(features);

    Style style;

    LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>();
    ls->stroke()->color() = Color::Yellow;
    ls->stroke()->width() = 2.0f;
    ls->tessellationSize()->set(100, Units::KILOMETERS);

    if (useDraping)
    {
        AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>();
        alt->clamping() = alt->CLAMP_TO_TERRAIN;
        alt->technique() = alt->TECHNIQUE_DRAPE;
    }

    else if (useClamping)
    {
        AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>();
        alt->clamping() = alt->CLAMP_TO_TERRAIN;
        alt->technique() = alt->TECHNIQUE_GPU;

        ls->tessellationSize()->set(100, Units::KILOMETERS);

        RenderSymbol* render = style.getOrCreate<RenderSymbol>();
        render->depthOffset()->enabled() = true;
    }

    if (useRaster)
    {
        FeatureImageLayer* layer = new FeatureImageLayer();
        layer->setFeatureSource(features);
        StyleSheet* sheet = new StyleSheet();
        sheet->addStyle(style);
        layer->setStyleSheet(sheet);
        map->addLayer(layer);
    }

    else
    {
        FeatureModelLayer* layer = new FeatureModelLayer();
        layer->setFeatureSource(features);

        StyleSheet* styleSheet = new StyleSheet();

        if (useScript)
        {
            styleSheet->addStylesFromCSS(styles_css);
            styleSheet->setScript(new StyleSheet::ScriptDef(script_source));
            styleSheet->addSelector(StyleSelector("default", StringExpression("getStyleClass()")));
        }
        else
        {
            styleSheet->addStyle(style);
        }

        layer->setStyleSheet(styleSheet);
        map->addLayer(layer);
    }

    if (useLabels && !useRaster)
    {
        Style labelStyle;

        TextSymbol* text = labelStyle.getOrCreateSymbol<TextSymbol>();
        text->content() = StringExpression("[name]");
        text->priority() = NumericExpression("[pop]");
        text->size() = 16.0f;
        text->alignment() = TextSymbol::ALIGN_CENTER_CENTER;
        text->fill()->color() = Color::White;
        text->halo()->color() = Color::DarkGray;

        StyleSheet* sheet = new StyleSheet();
        sheet->addStyle(labelStyle);

        FeatureModelLayer* fml = new FeatureModelLayer();
        fml->setName("Labels");
        fml->setFeatureSource(features);
        fml->setStyleSheet(sheet);
        map->addLayer(fml);
    }

    LayerVector layers;
    map->getLayers(layers);
    for (LayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i)
    {
        Layer* layer = i->get();
        if (layer->getStatus().isError() &&
            layer->getEnabled())
        {
            OE_WARN << layer->getName() << " : " << layer->getStatus().toString() << std::endl;
        }
    }

    MapNode* mapNode = new MapNode(map.get());

    if (!outfile.empty())
    {
        OE_NOTICE << "Writing to " << outfile << std::endl;
        osgDB::writeNodeFile(*mapNode, outfile);
    }
    else
    {
        viewer.setSceneData(mapNode);
        viewer.setCameraManipulator(new EarthManipulator());

        MapNodeHelper().configureView(&viewer);

        return viewer.run();
    }
}


上一篇:《OsgEarth开发笔记(二):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(中)
下一篇:敬请期待...


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113541346

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 2月4日

OsgEarth开发笔记(二):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(中)

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113540303

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

OSG与OsgEarth三维开发专栏

上一篇:《OsgEarth开发笔记(一):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(上)
下一篇:敬请期待...


前言

 上一篇编译了osg和osgCurl,本篇继续。


OsgEarth编译过程简介

  OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。


目标:Qt5.15.x + VS2019 x64版本


演示Demo

  Demo基于Qt5.15.2 + vs2019 x64 + osg3.6.3 + osgEarth3.1。
  在这里插入图片描述
  演示环境Demo下载地址:https://download.csdn.net/download/qq21497936/14984791


编译PROJ 6.2.0

步骤一:下载解压

  https://proj.org/download.html
  在这里插入图片描述

步骤二:CMake配置,添加sqlite3

  在这里插入图片描述

  补充:没有添加SQLIte,则会报错:
  在这里插入图片描述

步骤三:CMake生成工程

  在这里插入图片描述

步骤四:打开编译

  在这里插入图片描述

步骤五:编译成功

  在这里插入图片描述
  在这里插入图片描述


编译GDAL 3.2.1

步骤一:下载解压

  https://gdal.org/download.html
  在这里插入图片描述

步骤二:修改源码

  修改目录下的nmake.opt文件,如下:
  在这里插入图片描述
  第41行的代码修改为:

!IFNDEF MSVC_VER
#MSVC_VER=1800 # VS2013
#MSVC_VER=1900 # VS2015
#MSVC_VER=1910 # vs2017
MSVC_VER=1921 # VS2019
!ENDIF

步骤三:打开vs2019x64命令行编译

   在这里插入图片描述
  在这里插入图片描述

  找到目录,并输入命令:

nmake /f makefile.vc

  出现错误:
  在这里插入图片描述
  编译proj,参考前一个标题《编译PROJ 6.2.0》,并修改如下:
  在这里插入图片描述
  然后继续编译:
  在这里插入图片描述

  重新检查编译几次,依旧不行,检查后发现,是需要直接引入库,继续修改nmake.opt,,如下图:
  在这里插入图片描述

步骤四:编译成功

nmake /f makefile.vc MSVC_VER=1921 WIN64=1 DEBUG=1

  在这里插入图片描述

nmake /f makefile.vc MSVC_VER=1921 WIN64=1

  在这里插入图片描述


上一篇:《OsgEarth开发笔记(一):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(上)
下一篇:敬请期待...


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113540303

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 2月1日

OsgEarth开发笔记(一):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(上)

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113530959

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

OSG与OsgEarth三维开发专栏

上一篇:没有了
下一篇:敬请期待...


前言

  OSG研究之后,做地理GIS显示了地球:《项目实战:Qt+OSG教育学科工具之地理三维星球》,这一文章是基于OSG做的,而基于OsgEarth是可以进一步对地球进行深度操作,所以本篇开启OsgEarth系列。


OsgEarth编译过程简介

  OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译OsgEarth,然后编译OsgEarth。
OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。


目标:Qt5.15.x + VS2019 x64版本


演示Demo

  Demo基于Qt5.15.2 + vs2019 x64 + osg3.6.3 + osgEarth3.1。

  在这里插入图片描述


编译Osg 3.6.3

  使用Osg3.4.0版本编译,可参照:
OSG开发笔记(一):OSG介绍、编译
  下面进入本次目标版本的编译。

步骤一:下载解压

  选择osg版本为3.6.3,因为搭配3.4.0存在一些函数未定义,所以是osgEarth应该是不兼容osg3.4.x了。
  (注意:以下以3.4演示,3.6的读者自己改下)
  osg官网:http://www.openscenegraph.org/
  在这里插入图片描述

  (备注:博主QQ群提供文件下载,博客首页有扫码加群)

步骤二:CMake配置

  在这里插入图片描述

步骤三:CMake生成工程

  在这里插入图片描述

步骤四:打开工程编译

  在这里插入图片描述

步骤五:编程成功

  编译Debug x64版本和Relase x64版本。
  在这里插入图片描述
  在这里插入图片描述


编译Curl 7.65.3

步骤一:下载解压

  在这里插入图片描述
 (备注:博主QQ群提供文件下载,博客首页有扫码加群)

步骤二:CMake配置

   在这里插入图片描述

步骤三:CMake生成工程

   在这里插入图片描述

步骤四:打开工程编译

   在这里插入图片描述

步骤五:编译成功

  在这里插入图片描述
   在这里插入图片描述


上一篇:没有了
下一篇:敬请期待...


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113530959

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 1月21日

地图开发笔记(二):Qt与百度地图js交互的基础-Qt向Js发送指令定位各大省份与城市

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/112871383

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:三方库开发技术

上一篇:《地图开发笔记(一):百度地图介绍、使用和Qt内嵌地图Demo
下一篇:持续更新...


前言

  Qt要与百度地图交互,百度地图提供的JS,那么交互就是Qt与JS交互,本章Qt向JS交互发送指令。


Demo

  在这里插入图片描述
  在这里插入图片描述


Qt控制JS

  Qt控制JS相对界面,直接使用QWebEnginePage的runJavaScript接口即可,函数接口如下:

void runJavaScript(const QString& scriptSource);
void runJavaScript(const QString& scriptSource, quint32 worldId);
void runJavaScript(const QString& scriptSource, const QWebEngineCallback<const QVariant &> &resultCallback);
void runJavaScript(const QString& scriptSource, quint32 worldId, const QWebEngineCallback<const QVariant &> &resultCallback);
  • 参数一:执行的js脚本内容
    其他参数请自行查看。


百度地图API

设置中心点和缩放等级

  在这里插入图片描述

示例

var map = new BMap.Map("allmap");
var point = new BMap.Point(116.331398,39.897445);
map.centerAndZoom(point,12);

定位当前所在的城市

  LocalCity定位类
  在这里插入图片描述
   LocalCityOptions该类使用回调函数传回结果
  在这里插入图片描述

  LocalCityResult定位结果的结果类描述
  在这里插入图片描述

示例

function myFun(result){
    var cityName = result.name;
    map.setCenter(cityName);
    alert("当前定位城市:"+cityName);
}
var myCity = new BMap.LocalCity();
myCity.get(myFun); 

设置地图缩放等级

  核心类Map
在这里插入图片描述

示例

map.setZoom(13)

定位指定的城市

  核心类Map
在这里插入图片描述

示例

map.setCenter(“长沙市”)


Demo关键代码

void BaiDuMapWidget::locateCurrentPos()
{
    _pWebEnginePage->runJavaScript(QSTRING("var geolocation = new BMap.Geolocation();"
                                   "geolocation.enableSDKLocation();"
                                   "geolocation.getCurrentPosition(function(r){"
                                   "   if(this.getStatus() == BMAP_STATUS_SUCCESS){"
                                   "       var mk = new BMap.Marker(r.point);"
                                   "       map.addOverlay(mk);"
                                   "       map.panTo(r.point);"
                                   "       alert('%1'+r.point.lng+','+r.point.lat);"
                                   "   }"
                                   "   else {"
                                   "       alert('%2'+this.getStatus());"
                                   "   }"
                                           "});").arg(QSTRING("您的位置")).arg(QSTRING("定位失败,错误码:")));
}

void BaiDuMapWidget::locateProvince(QString province)
{
    _pWebEnginePage->runJavaScript(QSTRING("map.setZoom(9);"
                                           "map.setCenter('%1')").arg(province));
}

void BaiDuMapWidget::locateCity(QString city)
{
    _pWebEnginePage->runJavaScript(QSTRING("map.setZoom(13);"
                                           "map.setCenter('%1')").arg(city));
}


入坑

入坑一:中文乱码问题

问题

  在这里插入图片描述

解决

  一开始输入的,从原头就需要加入QString::fromLocal8bit,如下图:
   在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述

入坑二:百度地图获取浏览器本地定位超时(暂未解决)

问题

  在这里插入图片描述

入坑三:调用一些函数无效

原因

  Js是脚本语言,当调用时,前面有错误后面的就不会执行。

解决

  找到未起作用的地方,看是否真的调用到了,使用alert弹出框查看。


上一篇:《地图开发笔记(一):百度地图介绍、使用和Qt内嵌地图Demo
下一篇:持续更新...


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/112871383

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 1月15日

项目实战:C#上位机+arduino下位机+控制点亮LED灯

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/112651809
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

开发专栏:项目实战


前言

  当前比较流行的arduino开发,联动做一个Demo。


应用构架

  上位机:C#上位机通过串口发送接收控制协议,来控制下位机;
  下位机:arduino下位机主控,接受上位机串口协议控制GPIO硬件引脚;
  硬件电路:面包板LED串220R电路,以arduino引脚驱动;


Demo

  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述


arduino开发板

  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述


硬件电路连接

  在这里插入图片描述

  在这里插入图片描述
  在这里插入图片描述


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/112651809

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 1月10日

地图开发笔记(一):百度地图介绍、使用和Qt内嵌地图Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/112413786
长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:三方库开发技术


前言

  Qt在地图方面的研发。


百度地图

介绍

  百度的地图分为多个开发,都是在线的(离线的需要自己提取,本篇解说在线地图)。
  百度地图JavaScript API支持HTTP和HTTPS,免费对外开放,可直接使用。接口使用无次数限制。在使用前,您需先申请密钥才可使用。
  目前百度可使用的在线API分为四个版本:

  • JavaScript API Lite

  百度地图JavaScript API Lite 版是一套由JavaScript语言编写的应用程序接口。能够帮助您在移动端浏览器上构建地图应用。和JavaScript API标准版相比,Lite版专门针对移动端H5页面的使用场景,代码体积小,性能更好。 因为Lite版不支持PC浏览器,开发指南中不同功能相应页面最后均提供二维码,请使用手机扫描体验。

  • JavaScript API GL

  百度地图JavaScript API GL v1.0是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特性的地图开发。

  • JavaScript API v2.0

  百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特性的地图开发。

  • JavaScript API v3.0
      度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特性的地图开发。

申请密钥

  申请地址:http://lbsyun.baidu.com/apiconsole/key?application=key
在这里插入图片描述
在这里插入图片描述


网页调试

Html源码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>地图展示</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <style>
    body,
    html,
    #container {
        overflow: hidden;
        width: 100%;
        height: 100%;
        margin: 0;
        font-family: "微软雅黑";
    }
    .info {
        z-index: 999;
        width: auto;
        min-width: 22rem;
        padding: .75rem 1.25rem;
        margin-left: 1.25rem;
        position: fixed;
        top: 1rem;
        background-color: #fff;
        border-radius: .25rem;
        font-size: 14px;
        color: #666;
        box-shadow: 0 2px 6px 0 rgba(27, 142, 236, 0.5);
    }
    </style>
    <!-- <script data-original="//api.map.baidu.com/api?type=webgl&v=1.0&ak=填你的AK"></script> -->
    <!-- <script data-original="http://api.map.baidu.com/api?type=webgl&v=1.0&ak=填你的AK"></script> -->
    <!-- <script data-original="http://api.map.baidu.com/api?type=webgl&v=2.0&ak=填你的AK"></script> -->
    <script data-original="http://api.map.baidu.com/api?type=webgl&v=3.0&ak=填你的AK"></script>
</head>
<body>
    <div class = "info">最新版GL地图命名空间为BMapGL, 可按住鼠标右键控制地图旋转、修改倾斜角度。</div>
    <div id="container"></div>
</body>
</html>
<script>
var map = new BMapGL.Map('container'); // 创建Map实例
map.centerAndZoom(new BMapGL.Point(116.404, 39.915), 12); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放
</script>

  以上代码请注意:
  在这里插入图片描述

运行结果

  在这里插入图片描述


Demo

加载代码

_pWebEngineView = new QWebEngineView(this);
_pWebEnginePage = new QWebEnginePage(this);
_pWebChannel = new QWebChannel(this);
LOG << QFile::exists(_indexFilePath);
_pWebEnginePage->load(QUrl(_indexFilePath));
_pWebEnginePage->setWebChannel(_pWebChannel);
_pWebEngineView->setPage(_pWebEnginePage);

运行结果

  在这里插入图片描述


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/112413786

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 1月4日

项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111831179
长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

开发专栏:项目实战


需求

  1. 全屏软键盘;
  2. 输入英文;
  3. 输入中文;
  4. 支持触摸、键盘和输入混合输入;
  5. 目前有黑色系皮肤;
  6. Qt4和Qt5区分2个版本;


Demo:Qt5

  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  CSDN(粉丝免积分下载):https://download.csdn.net/download/qq21497936/13945327
  QQ群:1047134658(点击“文件”搜索“softKeyboard”,群内与博文同步更新)


Demo:Qt4

  移植到MCGS嵌入式工控机上
  在这里插入图片描述
  在这里插入图片描述


V1.0.0

  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述


Demo代码

  可视化的布局,以便于定制修改,所见即所得:
  在这里插入图片描述
KeyBoardWidget.h

#ifndef KEYBOARDWIDGET_H
#define KEYBOARDWIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLabel>

namespace Ui {
class KeyBoardWidget;
}

class KeyBoardWidget : public QWidget
{
    Q_OBJECT
private:
    enum INPUT_MODE {
        INPUT_MODE_ZH = 0x01,
        INPUT_MODE_EN,
        INPUT_MODE_SYMB,
    };

public:
    explicit KeyBoardWidget(QWidget *parent = 0);
    ~KeyBoardWidget();

public:
    void clearChineseCache();
    void setKeyPressEvent(QKeyEvent *event);

signals:
    void signal_sendKeyToFocusItem(QString keyText);

protected:
    void updateChineseCharactersButtonState();
    void switchLanguage(int inputMode);
    void searchChineseCharacters(int currentpage);

protected slots:
    void slot_characterButtonsClicked();
    void slot_switchLanguage();
    void slot_backspace();
    void slot_blankspace();
    void slot_chineseCharacterSelected();
    void slot_chineseCharacterPrevious();
    void slot_chineseCharacterNext();
    void slot_enter();
    void slot_upper();
    void slot_symbols();
    void slot_emoji();
    void slot_hideKeyboard();

protected:
    void updateKeyboard();

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void showEvent(QShowEvent *event);
    void hideEvent(QHideEvent *event);

private:
    Ui::KeyBoardWidget *ui;

private:
    QList<QPushButton*> _listCharacterBtns;
    QList<QPushButton*> _listChineseCharactersBtns;
    INPUT_MODE _currentMode;
    INPUT_MODE _lastMode;
    bool _upperMode;
    int _symbolPage;

    QFont _font;

private:
    static QString _strKeyboradCharacters;
    static QString _strKeyBoradSymbols[];
};

#endif // KEYBOARDWIDGET_H

KeyBoardWidget.cpp

#include "KeyBoardWidget.h"
#include "ui_KeyBoardWidget.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFontDatabase>
#include <QFile>
#include <QApplication>
#include <QMouseEvent>
#include <QDebug>
#include <QDesktopWidget>

...

KeyBoardWidget::KeyBoardWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::KeyBoardWidget),
    _currentMode(INPUT_MODE_EN),
    _upperMode(false),
    _symbolPage(0)
{
    ui->setupUi(this);

    this->setFixedSize(qApp->desktop()->width(), 380);

    //设置主窗体样式
    setWindowFlags(windowFlags()
                   | Qt::Tool
                   | Qt::FramelessWindowHint
                   | Qt::WindowStaysOnTopHint
                   | Qt::WindowDoesNotAcceptFocus);

    //图标字体
    int fontId = QFontDatabase::addApplicationFont(":/font/res/FontAwesome.otf");
    QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);
    _font.setFamily(fontName);
    _font.setPixelSize(24);

    // 中文汉字按键存入列表
    _listChineseCharactersBtns.append(ui->pushButton_r1);
    _listChineseCharactersBtns.append(ui->pushButton_r2);
    _listChineseCharactersBtns.append(ui->pushButton_r3);
    _listChineseCharactersBtns.append(ui->pushButton_r4);
    _listChineseCharactersBtns.append(ui->pushButton_r5);
    for(int index = 0; index < _listChineseCharactersBtns.size(); index++)
    {
        connect(_listChineseCharactersBtns.at(index), SIGNAL(clicked(bool)), this, SLOT(slot_chineseCharacterSelected()));
    }
    // 翻页按键
    ui->pushButton_prev->setFont(_font);
    ui->pushButton_prev->setText(QString(QChar(0xf0d9)));
    connect(ui->pushButton_prev, SIGNAL(clicked(bool)), this, SLOT(slot_chineseCharacterPrevious()));
    ui->pushButton_next->setFont(_font);
    ui->pushButton_next->setText(QString(QChar(0xf0da)));
    connect(ui->pushButton_next, SIGNAL(clicked(bool)), this, SLOT(slot_chineseCharacterNext()));
    // 字符按键存入列表
    _listCharacterBtns.append(ui->pushButton_c1);
    _listCharacterBtns.append(ui->pushButton_c2);
    _listCharacterBtns.append(ui->pushButton_c3);
    _listCharacterBtns.append(ui->pushButton_c4);
    _listCharacterBtns.append(ui->pushButton_c5);
    _listCharacterBtns.append(ui->pushButton_c6);
    _listCharacterBtns.append(ui->pushButton_c7);
    _listCharacterBtns.append(ui->pushButton_c8);
    _listCharacterBtns.append(ui->pushButton_c9);
    _listCharacterBtns.append(ui->pushButton_c10);
    _listCharacterBtns.append(ui->pushButton_c11);
    _listCharacterBtns.append(ui->pushButton_c12);
    _listCharacterBtns.append(ui->pushButton_c13);
    _listCharacterBtns.append(ui->pushButton_c14);
    _listCharacterBtns.append(ui->pushButton_c15);
    _listCharacterBtns.append(ui->pushButton_c16);
    _listCharacterBtns.append(ui->pushButton_c17);
    _listCharacterBtns.append(ui->pushButton_c18);
    _listCharacterBtns.append(ui->pushButton_c19);
    _listCharacterBtns.append(ui->pushButton_c20);
    _listCharacterBtns.append(ui->pushButton_c21);
    _listCharacterBtns.append(ui->pushButton_c22);
    _listCharacterBtns.append(ui->pushButton_c23);
    _listCharacterBtns.append(ui->pushButton_c24);
    _listCharacterBtns.append(ui->pushButton_c25);
    _listCharacterBtns.append(ui->pushButton_c26);
    _listCharacterBtns.append(ui->pushButton_c27);
    _listCharacterBtns.append(ui->pushButton_c28);
    _listCharacterBtns.append(ui->pushButton_c29);
    for(int index = 0; index < _strKeyboradCharacters.size(); index++)
    {
        _listCharacterBtns.at(index)->setText(_strKeyboradCharacters.at(index));
        connect(_listCharacterBtns.at(index), SIGNAL(clicked(bool)),
                this, SLOT(slot_characterButtonsClicked()));
    }
    // 功能键:回退
    ui->pushButton_backspace->setText(QChar(0xf060));
    ui->pushButton_backspace->setFont(_font);
    connect(ui->pushButton_backspace, SIGNAL(clicked(bool)), this, SLOT(slot_backspace()));
    // 功能键:大小写
    ui->pushButton_upper->setFont(_font);
    ui->pushButton_upper->setText(QChar(0xf062));
    connect(ui->pushButton_upper, SIGNAL(clicked(bool)), this, SLOT(slot_upper()));
    // 功能键:回车
    ui->pushButton_enter->setFont(_font);
    ui->pushButton_enter->setText("Enter");
    connect(ui->pushButton_enter, SIGNAL(clicked(bool)), this, SLOT(slot_enter()));
    // 功能键:切换符号
    ui->pushButton_symbol->setText(".?123");
    connect(ui->pushButton_symbol, SIGNAL(clicked(bool)), this, SLOT(slot_symbols()));
    // 功能键:语言切换
    ui->pushButton_language->setText("English");
    connect(ui->pushButton_language, SIGNAL(clicked(bool)), this, SLOT(slot_switchLanguage()));
    // 功能键:空格
    ui->pushButton_blankspace->setText("");
    connect(ui->pushButton_blankspace, SIGNAL(clicked(bool)), this, SLOT(slot_blankspace()));
    // 功能键:表情
    ui->pushButton_emoji->setFont(_font);
    ui->pushButton_emoji->setText(QChar(0xf118));
    connect(ui->pushButton_emoji, SIGNAL(clicked(bool)), this, SLOT(slot_emoji()));
    // 功能键:隐藏
    ui->pushButton_hideKeyboard->setFont(_font);
    ui->pushButton_hideKeyboard->setText(QString(QChar(0xf11c)).append(QChar(0xf103)));
    connect(ui->pushButton_hideKeyboard, SIGNAL(clicked(bool)), this, SLOT(slot_hideKeyboard()));

    updateChineseCharactersButtonState();
}

KeyBoardWidget::~KeyBoardWidget()
{
    delete ui;
}
...
void KeyBoardWidget::setKeyPressEvent(QKeyEvent *event)
{
    if(_currentMode == INPUT_MODE_SYMB
            && _symbolPage == 0)
    {
        switch (event->key())
        {
        case Qt::Key_1:
            _listCharacterBtns.at(0)->click();
            break;
        case Qt::Key_2:
            _listCharacterBtns.at(1)->click();
            break;
        case Qt::Key_3:
            _listCharacterBtns.at(2)->click();
            break;
        case Qt::Key_4:
            _listCharacterBtns.at(3)->click();
            break;
        case Qt::Key_5:
            _listCharacterBtns.at(4)->click();
            break;
        case Qt::Key_6:
            _listCharacterBtns.at(5)->click();
            break;
        case Qt::Key_7:
            _listCharacterBtns.at(6)->click();
            break;
        case Qt::Key_8:
            _listCharacterBtns.at(7)->click();
            break;
        case Qt::Key_9:
            _listCharacterBtns.at(8)->click();
            break;
        case Qt::Key_0:
            _listCharacterBtns.at(9)->click();
            break;
        case Qt::Key_Backspace:
            ui->pushButton_backspace->click();
            break;
        case Qt::Key_Return:
            ui->pushButton_enter->click();
            break;
        default:
            break;
        }
    }
    else
    {
        switch (event->key())
        {
        case Qt::Key_Q:
            _listCharacterBtns.at(0)->click();
            break;
        case Qt::Key_W:
            _listCharacterBtns.at(1)->click();
            break;
        case Qt::Key_E:
            _listCharacterBtns.at(2)->click();
            break;
        case Qt::Key_R:
            _listCharacterBtns.at(3)->click();
            break;
        case Qt::Key_T:
            _listCharacterBtns.at(4)->click();
            break;
        case Qt::Key_Y:
            _listCharacterBtns.at(5)->click();
            break;
        case Qt::Key_U:
            _listCharacterBtns.at(6)->click();
            break;
        case Qt::Key_I:
            _listCharacterBtns.at(7)->click();
            break;
        case Qt::Key_O:
            _listCharacterBtns.at(8)->click();
            break;
        case Qt::Key_P:
            _listCharacterBtns.at(9)->click();
            break;
        case Qt::Key_A:
            _listCharacterBtns.at(10)->click();
            break;
        case Qt::Key_S:
            _listCharacterBtns.at(11)->click();
            break;
        case Qt::Key_D:
            _listCharacterBtns.at(12)->click();
            break;
        case Qt::Key_F:
            _listCharacterBtns.at(13)->click();
            break;
        case Qt::Key_G:
            _listCharacterBtns.at(14)->click();
            break;
        case Qt::Key_H:
            _listCharacterBtns.at(15)->click();
            break;
        case Qt::Key_J:
            _listCharacterBtns.at(16)->click();
            break;
        case Qt::Key_K:
            _listCharacterBtns.at(17)->click();
            break;
        case Qt::Key_L:
            _listCharacterBtns.at(18)->click();
            break;
        case Qt::Key_Z:
            _listCharacterBtns.at(19)->click();
            break;
        case Qt::Key_X:
            _listCharacterBtns.at(20)->click();
            break;
        case Qt::Key_C:
            _listCharacterBtns.at(21)->click();
            break;
        case Qt::Key_V:
            _listCharacterBtns.at(22)->click();
            break;
        case Qt::Key_B:
            _listCharacterBtns.at(23)->click();
            break;
        case Qt::Key_N:
            _listCharacterBtns.at(24)->click();
            break;
        case Qt::Key_M:
            _listCharacterBtns.at(25)->click();
            break;
        case Qt::Key_Comma:
            _listCharacterBtns.at(26)->click();
            break;
        case Qt::Key_Period:
            _listCharacterBtns.at(27)->click();
            break;
        case Qt::Key_Question:
            _listCharacterBtns.at(28)->click();
            break;
        case Qt::Key_Backspace:
            ui->pushButton_backspace->click();
            break;
        case Qt::Key_Space:
            ui->pushButton_blankspace->click();
            break;
        case Qt::Key_Return:
            ui->pushButton_enter->click();
            break;
        case Qt::Key_CapsLock:
            ui->pushButton_upper->click();
            break;
        default:
            break;
        }
    }

}


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111831179

查看原文

赞 0 收藏 0 评论 0

AAA红模仿 发布了文章 · 1月4日

libzip开发笔记(一):libzip库介绍、编译和工程模板

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111876926
长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:三方库开发技术


前言

  Qt使用一些压缩解压功能,选择libzip库,libzip库比较原始,也是很多其他库的基础支撑库。


libzip

  libzip是一个C库,用于读取,创建和修改zip档案。可以从数据缓冲区,文件或直接从其他zip归档文件直接复制的压缩数据中添加文件。在不关闭存档的情况下所做的更改可以还原。
  当前版本是1.7.3,于2020年7月15日发布。
  官网:https://libzip.org/
  QQ群:1047134658(点击“文件”搜索“libzip”,群内与博文同步更新)


libzip编译

步骤一:解压

在这里插入图片描述

步骤二:Cmake配置(vs2017 x64版本)

在这里插入图片描述

  需要zlib,之前已经编译过vs2017 x64版本的zlib了,导入再配置
在这里插入图片描述

步骤三:生成工程

在这里插入图片描述

步骤四:打开VS2017编译

在这里插入图片描述

步骤五:安装install

在这里插入图片描述


模块化

在这里插入图片描述


补充:查看命令行工具帮助和源码辅助开发

ziptool.exe -h
usage: ziptool.exe [-ceghnrst] [-l len] [-o offset] archive command1 [args] [command2 [args] ...]

Supported options are:
        -c              check consistency
        -e              error if archive already exists (only useful with -n)
        -g              guess file name encoding (for stat)
        -h              display this usage
        -l len          only use len bytes of file
        -n              create archive if it doesn't exist
        -o offset       start reading file at offset
        -r              print raw file name encoding without translation (for stat)
        -s              follow file name convention strictly (for stat)
        -t              disregard current archive contents, if any

Supported commands and arguments are:
        add name content
            add file called name using content

        add_dir name
            add directory

        add_file name file_to_add offset len
            add file to archive, len bytes starting from offset

        add_from_zip name archivename index offset len
            add file from another archive, len bytes starting from offset

        cat index
            output file contents to stdout

        count_extra index flags
            show number of extra fields for archive entry

        count_extra_by_id index extra_id flags
            show number of extra fields of type extra_id for archive entry

        delete index
            remove entry

        delete_extra index extra_idx flags
            remove extra field

        delete_extra_by_id index extra_id extra_index flags
            remove extra field of type extra_id

        get_archive_comment
            show archive comment

        get_extra index extra_index flags
            show extra field

        get_extra_by_id index extra_id extra_index flags
            show extra field of type extra_id

        get_file_comment index
            get file comment

        get_num_entries flags
            get number of entries in archive

        name_locate name flags
            find entry in archive

        print_progress
            print progress during zip_close()

        rename index name
            rename entry

        replace_file_contents index data
            replace entry with data

        set_archive_comment comment
            set archive comment

        set_extra index extra_id extra_index flags value
            set extra field

        set_file_comment index comment
            set file comment

        set_file_compression index method compression_flags
            set file compression method

        set_file_dostime index time date
            set file modification time and date (DOS format)

        set_file_encryption index method password
            set file encryption method

        set_file_mtime index timestamp
            set file modification time

        set_file_mtime_all timestamp
            set file modification time for all files

        set_password password
            set default password for encryption

        stat index
            print information about entry


Supported flags are:
        0       (no flags)
        C       ZIP_FL_NOCASE
        c       ZIP_FL_CENTRAL
        d       ZIP_FL_NODIR
        l       ZIP_FL_LOCAL
        u       ZIP_FL_UNCHANGED

Supported compression methods are:
        default
        deflate
        store

Supported encryption methods are:
        none
        AES-128
        AES-192
        AES-256
        PKWARE

The index is zero-based.


工程模板v1.0.0

  对应工程模板:zipDemo_v1.0.0_基础模板_zip库的基础环境.rar


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111876926

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 0 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 1月3日
个人主页被 547 人浏览