QtXlsx读写.xlsx的图片

java读取wps嵌入式图片思路 主要过程就是-》基于xml 生成xsd 文件->xsd 文件生成java 代码 -》java 代码解析xml 内容获取关系,rid1和图片路径得关系poi 已经支持不用做,获取图片信息得方法poi 也不用做利用线程得就还(不会不了解xmlBean得可以自己去学习)当中使用xml得文件格式记录excel 得相关内容,poi 不能读取wps嵌入式图片,是因为这个是wps自己独有得并不属于office标准协议里得,加入图片新增一个悬浮图片得到得是。这个是获取rid 和图片路径得关系。 阅读详情

QtXlsx读写.xlsx的图片

先介绍一下.xlsx 的图片保存的xml文件。解压.xlsx文件后,在 /xl/drawings 目录下有对应sheet的图片.xml文件统一叫 drawingX.xml

[html]  view plain  copy
  1. <xdr:wsDr>  
  2. <xdr:twoCellAnchor editAs="oneCell">  
  3. <xdr:from>  
  4. <xdr:col>2</xdr:col>  
  5. <xdr:colOff>0</xdr:colOff>  
  6. <xdr:row>2</xdr:row>  
  7. <xdr:rowOff>165100</xdr:rowOff>  
  8. </xdr:from>  
  9. <xdr:to>  
  10. <xdr:col>4</xdr:col>  
  11. <xdr:colOff>671830</xdr:colOff>  
  12. <xdr:row>8</xdr:row>  
  13. <xdr:rowOff>154305</xdr:rowOff>  
  14. </xdr:to>  
  15. <xdr:pic>  
  16. <xdr:nvPicPr>  
  17. <xdr:cNvPr id="2" name="图片 1" descr="image1"/>  
  18. <xdr:cNvPicPr>  
  19. <a:picLocks noChangeAspect="1"/>  
  20. </xdr:cNvPicPr>  
  21. </xdr:nvPicPr>  
  22. <xdr:blipFill>  
  23. <a:blip r:embed="rId1"/>  
  24. <a:srcRect/>  
  25. <a:stretch>  
  26. <a:fillRect/>  
  27. </a:stretch>  
  28. </xdr:blipFill>  
  29. <xdr:spPr>  
  30. <a:xfrm>  
  31. <a:off x="1371600" y="527050"/>  
  32. <a:ext cx="1662430" cy="1017905"/>  
  33. </a:xfrm>  
  34. <a:prstGeom prst="rect">  
  35. <a:avLst/>  
  36. </a:prstGeom>  
  37. </xdr:spPr>  
  38. </xdr:pic>  
  39. <xdr:clientData/>  
  40. </xdr:twoCellAnchor>  
  41. </xdr:wsDr>  
比如这个是我的某一个drawing1.xml文件,其中xdr:twoCellAnchor表示了确定图片位置的方式,.xlsx 共有3中方式,除了前面的还有OneCellAnchor和AbsoluteAnchor。

xdr:from 和 xdr:to 分别是这个twoCellAnchor的两个位置参数。明显,这个twoCellAnchor表示图片位置由两个单元格的位置确认,同理OneCell由一个确定,而AbsoluteAnchor则直接给定坐标

form 和to 标签下有col ,row还有对应的rowoff和coloff是对应的偏移量,现在回过头来看QXlsx

QXlsx写入图片

 QXlsx只给了一个插入图片的方法

[cpp]  view plain  copy
  1. bool Document::insertImage(int row, int column, const QImage &image)  

这个方法非常简单粗糙,继续看里面的内容

[cpp]  view plain  copy
  1. bool Worksheet::insertImage(int row, int column, const QImage &image)  
  2. {  
  3.     Q_D(Worksheet);  
  4.   
  5.     if (image.isNull())  
  6.         return false;  
  7.   
  8.     if (!d->drawing)  
  9.         d->drawing = QSharedPointer<Drawing>(new Drawing(this, F_NewFromScratch));  
  10.   
  11.     DrawingOneCellAnchor *anchor = new DrawingOneCellAnchor(d->drawing.data(), DrawingAnchor::Picture);  
  12.   
  13.     /* 
  14.         The size are expressed as English Metric Units (EMUs). There are 
  15.         12,700 EMUs per point. Therefore, 12,700 * 3 /4 = 9,525 EMUs per 
  16.         pixel 
  17.     */  
  18.     anchor->from = XlsxMarker(row, column, 0, 0);//rowoff 和 coloff 直接给的0  
  19.     anchor->ext = QSize(image.width() * 9525, image.height() * 9525);  
  20.   
  21.     anchor->setObjectPicture(image);  
  22.     return true;  
  23. }  

实际上只插入了一张 OneCellAnchor的图片,连rowoff 和coloff都直接填的0,这样应该很难满足我们的要求的

[cpp]  view plain  copy
  1. class DrawingAbsoluteAnchor : public DrawingAnchor  
  2. {  
  3. public:  
  4.     DrawingAbsoluteAnchor(Drawing *drawing, ObjectType objectType=Unknown);  
  5.   
  6.     QPoint pos;  
  7.     QSize ext;  
  8.   
  9.     bool loadFromXml(QXmlStreamReader &reader);  
  10.     void saveToXml(QXmlStreamWriter &writer) const;  
  11. };  
  12.   
  13. class DrawingOneCellAnchor : public DrawingAnchor  
  14. {  
  15. public:  
  16.     DrawingOneCellAnchor(Drawing *drawing, ObjectType objectType=Unknown);  
  17.   
  18.     XlsxMarker from;  
  19.     QSize ext;  
  20.   
  21.     bool loadFromXml(QXmlStreamReader &reader);  
  22.     void saveToXml(QXmlStreamWriter &writer) const;  
  23. };  
  24.   
  25. class DrawingTwoCellAnchor : public DrawingAnchor  
  26. {  
  27. public:  
  28.     DrawingTwoCellAnchor(Drawing *drawing, ObjectType objectType=Unknown);  
  29.   
  30.     XlsxMarker from;  
  31.     XlsxMarker to;  
  32.   
  33.     bool loadFromXml(QXmlStreamReader &reader);  
  34.     void saveToXml(QXmlStreamWriter &writer) const;  
  35. };  
  36.   
  37. }   

实际上 QXlsx 已经完全定义好了这三种格式的图片,功能都已经完成了,真正有需要的话,可以自己仿照他的方法把剩下的两种写好

2015-12-28 编辑

自行添加了三种方法,在xlsxworksheet.h头文件中,可以参考一下

[cpp]  view plain  copy
  1. bool insertImage(XlsxMarker star_cell, QSize size,const QImage &image);  
  2. bool insertImage(XlsxMarker star_cell, XlsxMarker end_cell,const QImage &image);  
  3. bool insertImage(QPoint star,QSize size, const QImage &image);  

分别对应 onecell  、twocell 以及 absolute

[cpp]  view plain  copy
  1. bool Worksheet::insertImage(XlsxMarker star_cell, QSize size, const QImage &image)  
  2. {  
  3.     Q_D(Worksheet);  
  4.   
  5.     if (image.isNull())  
  6.         return false;  
  7.   
  8.     if (!d->drawing)  
  9.         d->drawing = QSharedPointer<Drawing>(new Drawing(this, F_NewFromScratch));  
  10.     DrawingOneCellAnchor *anchor = new DrawingOneCellAnchor(d->drawing.data(), DrawingAnchor::Picture);  
  11.     anchor->from = XlsxMarker(star_cell.row(), star_cell.col(), star_cell.rowOff()*9525, star_cell.colOff()*9525);  
  12.     anchor->ext = QSize(size.width() * 9525, size.height() * 9525);  
  13.   
  14.     anchor->setObjectPicture(image);  
  15.     return true;  
  16.   
  17. }  
  18.   
  19. bool Worksheet::insertImage(XlsxMarker star_cell, XlsxMarker end_cell, const QImage &image)  
  20. {  
  21.     Q_D(Worksheet);  
  22.   
  23.     if (image.isNull())  
  24.         return false;  
  25.   
  26.     if (!d->drawing)  
  27.         d->drawing = QSharedPointer<Drawing>(new Drawing(this, F_NewFromScratch));  
  28.     DrawingTwoCellAnchor *anchor = new DrawingTwoCellAnchor(d->drawing.data(), DrawingAnchor::Picture);  
  29.     anchor->from = XlsxMarker(star_cell.row(), star_cell.col(), star_cell.rowOff()*9525, star_cell.colOff()*9525);  
  30.     anchor->to = XlsxMarker(end_cell.row(), end_cell.col(), end_cell.rowOff()*9525, end_cell.colOff()*9525);  
  31.   
  32.     anchor->setObjectPicture(image);  
  33.     return true;  
  34.   
  35. }  
  36.   
  37. bool Worksheet::insertImage(QPoint star, QSize size, const QImage &image)  
  38. {  
  39.     Q_D(Worksheet);  
  40.   
  41.     if (image.isNull())  
  42.         return false;  
  43.   
  44.     if (!d->drawing)  
  45.         d->drawing = QSharedPointer<Drawing>(new Drawing(this, F_NewFromScratch));  
  46.     DrawingAbsoluteAnchor *anchor = new DrawingAbsoluteAnchor(d->drawing.data(), DrawingAnchor::Picture);  
  47.     anchor->pos=star*9525;  
  48.     anchor->ext=size*9525;  
  49.     anchor->setObjectPicture(image);  
  50.     return true;  
  51.   
  52. }  

这里传入的都是对应的界面值,也就是 pix 单位的参数,所以存入的参数都乘以了 9525 需要注意一下


QXlsx读取图片

        读取图片,QXlsx完全就没有提供接口,只能靠自己完成了。实际上,QXlsx已经读取了图片信息

[cpp]  view plain  copy
  1. for (int i=0; i<workbook->drawings().size(); ++i) {  
  2.     Drawing *drawing = workbook->drawings()[i];  
  3.     QString rel_path = getRelFilePath(drawing->filePath());  
  4.     if (zipReader.filePaths().contains(rel_path))  
  5.         drawing->relationships()->loadFromXmlData(zipReader.fileData(rel_path));  
  6.     drawing->loadFromXmlData(zipReader.fileData(drawing->filePath()));  
  7. }  

    所以,稍微修改源码,我们也能提取到里面的图片
[cpp]  view plain  copy
  1.    foreach(QString sheetName,xls_doc->sheetNames())  
  2.    {  
  3.        Worksheet *sheet = static_cast<Worksheet *>(xls_doc->sheet(sheetName));  
  4.        if(sheet)  
  5.        {  
  6.            Drawing *drawing = sheet->drawing();  
  7.            if(drawing)  
  8.            {  
  9.                qDebug()<<drawing->anchors.count();  
  10.                for(int j=0;j<drawing->anchors.count();j++)  
  11.                {  
  12.                    DrawingAnchor *my_anchor=drawing->anchors.at(j);  
  13.                    MediaFile* m_mediafile=my_anchor->m_pictureFile.data();  
  14.                    QImage image;  
  15.                    QByteArray contents=m_mediafile->m_contents;  
  16.                    
  17.                    if(my_anchor->DrawingName=="DrawingTwoCellAnchor")  
  18.                    {  
  19.                        DrawingTwoCellAnchor* cellanchor=static_cast<DrawingTwoCellAnchor*>(my_anchor);  
  20.                        //                            qDebug()<<cellanchor->from.cell<<cellanchor->from.offset/9525;  
  21.                        //                            qDebug()<<cellanchor->to.cell<<cellanchor->to.offset/9525;  
  22.                         
  23.                    }  
  24.                    if(my_anchor->DrawingName=="DrawingOneCellAnchor")  
  25.                    {  
  26.                        DrawingOneCellAnchor* cellanchor=static_cast<DrawingOneCellAnchor*>(my_anchor);  
  27.                    }  
  28.                    if(my_anchor->DrawingName=="DrawingAbsoluteAnchor")  
  29.                    {  
  30.                        DrawingAbsoluteAnchor* cellanchor=static_cast<DrawingAbsoluteAnchor*>(my_anchor);  
  31.                    }  
  32.   
  33.                     
  34.                }  
  35.   
  36.            }  
  37.   
  38.     }  
  39. }  
        
sheet->drawing();是一个私有的方法,需要在源码中修改一下。

这里我为了分清3中派生的类自己添加了一个 DrawingName

sheet 下面的drawing 有个一个叫 anchors 的QList 

[cpp]  view plain  copy
  1. class Drawing : public AbstractOOXmlFile  
  2. {  
  3. public:  
  4.     Drawing(AbstractSheet *sheet, CreateFlag flag);  
  5.     ~Drawing();  
  6.     void saveToXmlFile(QIODevice *device) const;  
  7.     bool loadFromXmlFile(QIODevice *device);  
  8.   
  9.     AbstractSheet *sheet;  
  10.     Workbook *workbook;  
  11.     QList<DrawingAnchor *> anchors;  
  12. };  
我们需要的就是从DrawingAnchor *中得到

[cpp]  view plain  copy
  1. QSharedPointer<MediaFile> m_pictureFile;  

[cpp]  view plain  copy
  1. QByteArray MediaFile::contents() const  
  2. {  
  3.     return m_contents;  
  4. }  

这就是我们需要的图片信息了

[cpp]  view plain  copy
  1. new_image=QImage::fromData(cellanchor->m_pictureFile.data()->contents());  

这样就可以得到我们需要的图片,而位置信息可以自行从上述的3个类中寻找
QtXlsx实战:不用Excel也能轻松读写xlsx文件的5个应用场景 本文介绍了QtXlsx库在5个实际应用场景中的高效使用,包括自动化报表生成、跨平台数据交换、可视化数据分析、配置管理和教育评估系统。通过QtXlsx,开发者无需依赖Excel即可实现专业级xlsx文件读写,提升开发效率和跨平台兼容性。 阅读详情

相关推荐

Qt新版本实战指南:从环境配置到模块集成与打包发布

跨平台C++应用程序开发框架是构建桌面、移动及嵌入式系统原生应用的核心工具,其核心原理在于“一次编写,随处编译”,通过丰富的类库支持GUI、网络、数据库等开发。其技术价值在于显著提升开发效率与代码复用率,降低多平台适配成本。在工业控制、物联网、数据可视化等应用场景中,开发者常需处理环境配置、模块集成与项目发布等工程实践问题。本文聚焦于Qt框架,针对新版本升级、Qt Creator项目编译配置、以及如何解决unknown module(s) in qt: xlsx等常见模块错误,提供从环境部署到打包发布的系统

weixin_34034670的博客 492

Qt读写Excel--QXlsx插入、读取图片6

1. 在当前Sheet指定位置插入图片; 2. 获取当前Sheet中图片个数; 3. 通过索引方式和行列号方式读取当前Sheet中的图片。

mahuifa的博客 5116

Qt开发“Night难度”问题实战指南:从编译配置到性能优化

在跨平台GUI开发中,Qt框架因其强大的功能和良好的封装性被广泛应用。其核心原理基于C++和信号槽机制,通过元对象系统实现组件通信。技术价值在于能够高效构建高性能、可维护的桌面和嵌入式应用。然而,在实际工程实践中,开发者常面临模块集成、跨平台兼容性和性能优化等复杂挑战,这些正是Qt开发中的“Night难度”问题。本文聚焦于模块缺失、第三方库集成和图形渲染优化等高频场景,提供从环境准备到问题定位的系统性解决方案,帮助开发者有效应对编译配置、Halcon集成和QGraphicsView性能优化等典型难题,提升项

weixin_34221276的博客 482

excel底层数据结构原来是这样的

前言 上一节说了如何使用java读取excel里面的图片,一个同事说没必要这么麻烦,他说不用任何开发工具都可以获取到excel里面的图片。我表示不信的样子,他说让一下,让我秀一波操作给你看看 EXCEL的底层实现 修改后缀名为zip 解压zip docProps目录 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f99Tl4Zw-1594950714545)(https://i.loli.net/2020/07/17/DlnM4pZ7B9XK1Er.jpg)] core.

时刻在奔跑的博客 6057

Qt框架更新解析:从模块依赖到打包部署的C++跨平台开发实战

C++跨平台应用开发框架是现代软件开发中的重要工具,它通过提供统一的API抽象层,实现了“一次编写,到处编译”的核心价值。这类框架通常包含GUI组件、网络通信、数据序列化等模块,其技术价值在于显著提升开发效率,降低多平台适配成本,广泛应用于桌面软件、嵌入式系统、工业控制等领域。在众多解决方案中,Qt以其成熟的元对象系统和信号槽机制脱颖而出。近期Qt官方更新针对开发者长期关注的模块依赖管理和应用部署等痛点进行了优化,例如对xlsx模块安装流程的简化和MSVC编译链配置的改进,使得开发体验更加流畅。这些更新直接

weixin_34067102的博客 304

Qt 6.7 LTS 新特性解析与实战:从环境搭建到部署发布

C++20 是现代 C++ 开发的重要标准,它引入了概念、范围库、协程等特性,旨在提升代码的表达力、安全性和性能。其原理在于通过更严格的类型约束和更高级的抽象,帮助开发者编写更清晰、更高效的代码。在跨平台 GUI 开发领域,Qt 框架将这些现代 C++ 特性与稳定的图形界面库相结合,技术价值体现在既能享受语言进化的红利,又能保障大型项目的可维护性与部署可靠性。应用场景广泛,从桌面应用到嵌入式系统,再到移动端开发,都需要这种平衡。本文聚焦于 Qt 6.7 LTS 这一长期支持版本,它全面支持 C++20,并增

weixin_34151004的博客 515

.xlsx文件读写库QT库,QtXlsx使用整理

.xlsx文件读写库QT库,QtXlsx使用整理 以前都是翻抄别人的东西,最近在linux下研究xlsx文件,找到了这个开源的库好好研究了一下。总结出一点自己的东西,也算是始于足下。 QtXlsx其实是一个功能非常齐全的开源库了,各种功能都有。因为主要的任务在图片的读写,所以在图片这方面探究的比较多,其他的部分应该也有类似的问题,等待以后慢慢探究。 QtXlsx源码拖下来测试来看主要有这么几

qq_27681837的博客 4118

Qt Xlsx ( QtXlsxWriter ) 使用例程

对于Qt Xlsx ( QtXlsxWriter ) 的安装请参考: http://blog.csdn.net/woshidahuaidan2011/article/details/52724452 这里主要介绍其基本的编程使用方法。 首先我们想到就是对xlsx文件进行读写,因此我们有如下的代码:#include <QtCore> #include "xlsxdocument.h" #incl

Never too old to learn. 2万+

告别Excel依赖!用QtXlsx在Qt5中轻松读写Excel文件(附完整配置流程)

本文详细介绍了如何在Qt5项目中集成和使用QtXlsx库,实现无需依赖Microsoft Office即可轻松读写Excel文件。文章提供了从Perl环境搭建、源码编译到项目集成的完整配置流程,并通过实战代码演示了数据读写、样式美化和多工作表操作等核心功能,帮助开发者彻底摆脱Excel运行时依赖,构建跨平台的桌面报表应用。

silver的专栏 877

Qt读写Excel--使用QXlsx库通过Document对象操作工作表

在Qt应用程序开发中,有时候我们需要读取和写入Excel文件。QXlsx是一个开源的Qt库,提供了简单易用的接口,用于读取、写入和修改Excel文件。总结起来,通过QXlsx库和Document对象,我们可以方便地读取、写入和修改Excel文件。使用简单的接口,我们可以轻松地操作Excel工作表,实现各种自定义的需求。方法,我们可以在指定的单元格中写入数据。在本例中,我们在第一行写入了标题,然后在第二行和第三行分别写入了两个人的信息。除了写入数据,QXlsx还提供了丰富的读取和修改Excel文件的功能。

HackLogic的博客 954

QtXlsx在Qt应用程序中实现Excel文件的读写操作指南

QtXlsx是一个开源的C++库,专为Qt应用程序设计,用于处理Microsoft Excel文件(XLSX格式)。它提供了一套简洁的API,让开发者可以轻松地读取、创建、修改及写入XLSX文件,同时支持基本的Excel功能,例如样式设置、单元格公式、图表等。由于QtXlsx完全基于C++标准,无需依赖COM或其他非标准库,因此它具有良好的跨平台特性和编译时类型安全保证。单元格样式是单元格外观的集合,包括字体、颜色、边框等。这些属性的调整可以让工作表看起来更加美观,并且更易于阅读。

weixin_42360733的博客 1741

Qt 使用QtXlsx库处理Excel文件

QtXlsx是一个基于Qt框架的开源库,用于读写Excel文件(.xlsx格式),无需安装Office组件。它支持跨平台使用,提供基本读写、格式设置、图表生成等功能。安装方法包括源码编译和Qt项目配置,使用时需在.pro文件中添加包含路径和链接库。代码示例展示了如何创建Excel文件、读取数据、设置格式以及添加图表。该库适用于报表生成、数据导出等场景,但不支持旧版.xls格式。使用中需注意中文乱码、性能优化等问题。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 2659

QT使用QXlsx读取excel表格中的图片

QT使用QXlsx读取excel表格中的图片

Qt读写Excel--QXlsx基本使用

Document类是一个用于操作 XLSX 文件的类,继承自QObject。它提供了对 Excel 文件的读写操作,包括单元格的读写、图片和图表的插入、单元格合并、列和行的格式化、数据验证和条件格式化等功能。此外,它还支持对工作簿和工作表的操作,如添加、删除、重命名工作表等。这个类可以用于创建、编辑和保存 XLSX 文件,也可以将 XLSX 文件的内容保存为 CSV 格式。

ckg3824278的博客 1673

Oracle OCP 19c 认证1Z0-083考试大纲(Oracle官方版)

Oracle Database: Managing Multitenant Architecture Ed 1 course

#真题在线# 1588

DNF单机版搭建全攻略:从零开始到局域网联机(含常见问题解决)

本文提供详细的DNF单机版搭建指南,从环境配置到局域网联机设置,涵盖服务端安装、数据库配置及常见问题解决方案。适合新手和有经验的玩家,帮助快速搭建专属游戏服务器,重温经典游戏体验。

weixin_30832143的博客 845

QXlsx用法简介

它无需依赖 Microsoft Excel,适合在跨平台应用(如 Windows/Linux/macOS)中处理电子表格数据。通过上述示例,你可以快速上手 QXlsx 的基本和高级功能。更详细的 API 请参考。QXlsx 是一个基于 Qt 的开源库,用于读写 Excel 的。

Taylor_0522的博客 828

Chromatix 7实战:从零开始调优ISP模块的完整流程(附常见报错解决方案)

本文提供了高通平台Camera调试工具Chromatix 7的完整实战指南。详细阐述了从环境准备、项目初始化、基础校正(如LSC、BPC)到核心ISP管线(Demosaic、CCM、HDR)及后处理(CAC、ANR)的调优全流程,并附带了常见报错(如“未初始化实例”)的解决方案,旨在帮助工程师建立系统性的调试方法论。

weixin_29290863的博客 622

Qt桌面应用数据导出全攻略:Excel、CSV、PDF与Word表格生成方案

在桌面应用开发中,数据持久化与交换是核心需求,而表格数据导出是实现这一功能的关键技术。其原理在于将程序内部数据结构(如Qt的模型/视图架构)转换为通用文件格式,以满足不同场景下的使用需求。这项技术的价值在于提升软件的专业度和用户体验,使数据能够跨平台、跨应用无缝流转。常见的应用场景包括数据分析报告生成、系统间数据交换、文档归档与打印等。本文聚焦于**Qt框架**下,针对**Excel、CSV、PDF和Word**这四种主流格式,提供了从技术选型、核心原理到工程实践的完整导出方案,特别是深入探讨了使用Qt X

weixin_33725239的博客 384

CANoe/CAPL ,远程邮件通知

CANoe/CAPL ,远程邮件通知

蚂蚁小兵 3035

Labview邪修01:贪吃蛇小游戏

摘要:博主使用LabVIEW 2020(32位)复刻了经典贪吃蛇游戏。程序具备随机生成蛇(初始长度3)和食物、三档速度调节、键盘方向控制等功能,碰撞边界或自身即游戏结束。实现过程包括:1)界面设计,使用二维颜色盒数组构建游戏区,添加速度枚举控件和功能按钮;2)程序架构,采用模块化设计包含Main.vi、Start.vi等6个核心VI,分别处理初始化、位置计算、碰撞检测等逻辑;3)事件驱动机制,通过开始/结束事件、按键响应和超时循环实现游戏流程控制。运行时可实时显示分数,完整还原了贪吃蛇的核心玩法。

weixin_38637405的博客 970

Qt 6 更新指南:CMake 整合、模块化与跨平台开发实践

跨平台应用程序开发框架是现代软件工程中解决多系统兼容性问题的核心技术,其原理在于通过统一的API抽象层屏蔽底层操作系统差异。这类框架的技术价值在于显著提升代码复用率、降低维护成本并加速产品迭代。在桌面GUI、嵌入式HMI、工业控制软件及数据可视化等应用场景中,开发者常需处理图形渲染、模块依赖与部署打包等工程挑战。本文聚焦Qt框架的最新更新,深入解析其向CMake构建系统的全面迁移、模块化架构引发的依赖管理问题(如常见的unknown module错误),并提供从环境配置、项目构建到性能优化的完整实践路径,帮

weixin_30781107的博客 313

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3157
上一篇: 超赞的OOM检测(除了mat以外)
下一篇: pthread_cond_signal 和 pthread_mutex_unlock顺序问题
鱼公子哟西
博客等级 码龄14年 17粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值