当前位置: 首页 > news >正文

QT For Android开发-打开PPT文件

一、前言

需求: Qt开发Android程序过程中,点击按钮就打开一个PPT文件。

Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件,非常方便。QDesktopServices提供了静态接口调用系统级别的功能。

这里用的QDesktopServices 是 Qt 框架中的一个类,用于在跨平台应用程序中方便地访问和使用主机操作系统的桌面服务和功能。该类提供了一些静态方法,用于打开网址、文件和邮件客户端等系统默认应用程序。它的主要目的是让开发者能够轻松调用系统级别的功能,而不需要直接编写与操作系统相关的代码。

代码如下:

QUrl url =  QUrl::fromLocalFile("storage/emulated/0/Download/UseHelp.ppt"); 
bool IsOK = QDesktopServices::openUrl(url);   

下面是QDesktopServices 的帮助文档介绍。

image-20240809101024234

QDesktopServices 只适用于桌面应用程序。 如果在Linux系统下想要打开PPT文件,也可以采用QDesktopServices 来实现。

前提也是需要先安装LibreOfficeOpenOffice才可以。

在Qt的文档里也提供了openUrl静态方法的使用说明。

image-20240809101206462

使用 QDesktopServices::openUrl在Linux系统上打开PPT文件。

#include <QDesktopServices>
#include <QUrl>
#include <QDebug>
​
int main(int argc, char *argv[])
{QApplication app(argc, argv);
​QString pptFilePath = "/path/to/your/presentation.ppt";QUrl pptUrl = QUrl::fromLocalFile(pptFilePath);
​if (!QDesktopServices::openUrl(pptUrl)) {qWarning() << "Failed to open PPT file.";}
​return app.exec();
}

但是在Android移动平台上,这个办法就行不通了。 需要通过JNI接口与Android系统交互,才可以完成系统级别的操作。

image-20240809100537433

二、通过JNI与Android系统交互

在Qt for Android中,可以通过Qt提供的Java Native Interface (JNI)与Android系统交互,可以调用系统功能,打开PPT文件。

下面演示如何在Qt中使用C++代码,通过JNI调用Android的Intent来打开PPT文件。

2.1 操作步骤

  1. 在Qt项目中添加Android相关的权限和活动声明

    • AndroidManifest.xml文件中添加必要的权限和活动声明。

  2. 使用Qt的JNI接口调用Android Intent

    • 在C++代码中使用Qt的JNI接口来调用Android的Intent。

2.2 代码

(1)AndroidManifest.xml

AndroidManifest.xml文件中添加以下权限声明,确保应用有权读取文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="org.qtproject.example"><application android:label="@string/app_name"><activity android:name="org.qtproject.qt5.android.bindings.QtActivity"android:configChanges="orientation|screenSize"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>

(2)Qt C++代码

在Qt C++代码中使用JNI接口调用Android的Intent来打开PPT文件。

#include <QCoreApplication>
#include <QAndroidJniObject>
#include <QtAndroid>
#include <QDebug>
​
void openPPTFile(const QString &filePath) {QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");if (activity.isValid()) {QAndroidJniObject intent("android/content/Intent", "()V");intent.callObjectMethod("setAction", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString("android.intent.action.VIEW").object<jstring>());
​QAndroidJniObject uri = QAndroidJniObject::callStaticObjectMethod("android/net/Uri","parse","(Ljava/lang/String;)Landroid/net/Uri;",QAndroidJniObject::fromString(filePath).object<jstring>());
​intent.callObjectMethod("setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;", uri.object<jobject>(), QAndroidJniObject::fromString("application/vnd.ms-powerpoint").object<jstring>());intent.callObjectMethod("addFlags", "(I)Landroid/content/Intent;", 0x10000000); // Intent.FLAG_ACTIVITY_NEW_TASKactivity.callMethod<void>("startActivity", "(Landroid/content/Intent;)V", intent.object<jobject>());} else {qDebug() << "Failed to get the activity.";}
}
​
int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);
​QString pptFilePath = "/sdcard/Download/sample.pptx"; // 指定要打开的PPT文件路径openPPTFile(pptFilePath);
​return app.exec();
}

2.3 代码说明

  1. openPPTFile函数:该函数接受PPT文件的路径作为参数,并使用JNI接口调用Android的Intent来打开该文件。

  2. QAndroidJniObject:用于与Java对象和方法交互。

  3. setActionsetDataAndType方法:设置Intent的操作和数据类型。

  4. startActivity方法:启动Intent以打开PPT文件。

2.4 编译和运行

需要先在Android设备上安装合适的PPT查看应用(比如:WPS),并且PPT文件路径正确。编译和运行Qt项目时,应用将通过系统默认的应用打开指定的PPT文件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用ffmpeg实现音视频文件格式转换
  • 深入解析Linux驱动开发中的I2C时序及I2C高频面试题
  • web基础—dvwa靶场(七)SQL Injection
  • 深度deepin初体验(一)系统详细安装过程 | 国产系统
  • patch 命令:补丁的应用
  • SpringBoot+Aop+注解方式 实现多数据源动态切换
  • [游戏技术]L4D服务器报错解决
  • 31省市农业地图大数据
  • 开源RK3588 AI Module7,并与Jetson Nano生态兼容的低功耗AI模块
  • Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)
  • 零工市场小程序:推动零工市场建设
  • MySQL Performance Schema 详解及运行时配置优化
  • 计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20
  • Nginx 反向代理
  • 随手记:前端一些定位bug的方法
  • Android 架构优化~MVP 架构改造
  • ECS应用管理最佳实践
  • HTTP中GET与POST的区别 99%的错误认识
  • 阿里云Kubernetes容器服务上体验Knative
  • 实现简单的正则表达式引擎
  • 小李飞刀:SQL题目刷起来!
  • AI算硅基生命吗,为什么?
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #includecmath
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #考研#计算机文化知识1(局域网及网络互联)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (javaweb)Http协议
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)c52学习之旅-流水LED灯
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)scrum常见工具列表
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net对接阿里云CSB服务
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .Net语言中的StringBuilder:入门到精通
  • .NET中统一的存储过程调用方法(收藏)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @ConditionalOnProperty注解使用说明
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @GlobalLock注解作用与原理解析
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)