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文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1539692.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

高效开发,从暗藏玄机的文件系统开始

4G-Cat.1模组的文件系统关乎数据传输速度、存储效率&#xff0c;以及数据安全性等等诸多因素&#xff0c;在应用开发中极为重要。 本期&#xff0c;我们来学习合宙Air201的实用示例——文件系统的使用 Air201文件系统的使用 合宙Air201资产定位模组——是一个集成超低功耗4G通…

深入探索迭代器模式的原理与应用

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 迭代器模式 &#x1f4bb; 迭代器模式 (Iterator Pattern) 是一种行为设计模…

saltstack高级用法

一、saltstack的高级用法 一、job管理 1、job简介 Jid&#xff1a;job id&#xff0c;格式为%Y%m%d%H%M%S%fmaster在下发指令消息时&#xff0c;会附带上产生的Jid&#xff0c;minion在接收到指令开始执行时&#xff0c;会在本地的cachedir&#xff08;默认是/var/cache/salt/…

力扣 2824.统计和小于目标的下标对数目

文章目录 题目介绍解法 题目介绍 解法 题目相当于从数组中选两个数&#xff0c;我们只关心这两个数的和是否小于 target&#xff0c;由于 abba&#xff0c;无论如何排列数组元素&#xff0c;都不会影响加法的结果&#xff0c;所以排序不影响结果的数量。 排序后&#xff1a; …

CDH Hive集群的create/drop慢问题,在200s 多一点处理分析

现象&#xff1a; CREATE TABLE test911 (SN String,PN_CODE String); Total time spent in this metastore function was greater than 1000ms : createTable_(Table, )200091 Hive集群的 create/drop 操作时间基本都稳定在 200s 多一点。 分析&#xff1a; HMS会实时向Sentr…

实战OpenCV之图像阈值处理

基础入门 图像阈值处理是一种二值化技术&#xff0c;它基于预设的阈值&#xff0c;可以将图像中的像素分为两大类&#xff1a;一大类是背景&#xff0c;另一大类是前景或目标对象。这个过程涉及将图像中的每个像素值与阈值进行比较&#xff0c;并根据比较结果决定保留原始值还是…

jmeter得到的文档数据处理

通过前面jmeter得到的输出文档&#xff0c;这里是txt文档&#xff0c;里面包含了很多条数据&#xff0c;每条数据的结构如下&#xff1a; 【request】 uuid&#xff1a;xxxxxxx timestamp&#xff1a;xxxxxxxx No.x question&#xff1a;xxxxxxx 【response】 code&#…

防火墙配置变更管理

在任何组织中&#xff0c;当涉及到网络安全时&#xff0c;频繁地更换防火墙是必要的&#xff0c;实施简化的防火墙更改管理策略模板可以减少管理时间&#xff0c;还可以减少每次变更引入新的安全性或合规性问题的可能性。典型的防火墙变更管理流程将包括以下步骤&#xff1a; …

排序----插入排序

一开始把第一个元素看成是有序的&#xff0c;然后从第二个元素开始拿出来与前面的数据比较&#xff0c;若前面的数据小&#xff0c;就把前面的数据不断后移&#xff08;注意要把拿出来的那个元素提前保存下来&#xff09;&#xff0c;直到遇到比自己小的元素&#xff0c;然后插…

大语言模型-教育方向数据集

大语言模型-教育方向数据集 编号论文数据集1Bitew S K, Hadifar A, Sterckx L, et al. Learning to Reuse Distractors to Support Multiple-Choice Question Generation in Education[J]. IEEE Transactions on Learning Technologies, 2022, 17: 375-390.Televic, NL, https…

Java 每日一刊(第12期):面向对象

“任何复杂的程序&#xff0c;都可以通过分解成若干个简单的问题来解决。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; 类对象类与对象的关系Java 中的三种变量类型OOP 的三大特性 类 类 是对现实世界中某类事物…

AntFlow系列教程之流程拒绝

这是开源项目AntFlow的一个系统入门使用教程.AntFlow是一款开源免费的企业级低代码工作流引擎.仿照钉钉设计,极大降低流程设计、开发和维护成本。详细介绍请查看历史文章&#xff1a;AntFlow开源仿钉钉低代码工作流平台集成RuoYi版本来啦 流程拒绝和流程同意提交的参数是一样的…

基于milvus数据库的RAG-Demo

1.上传文本并将文本向量化 import os from django.conf import settings from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter from langchain.vectorstores import Chroma from l…

【JAVA入门】Day47 - 线程

【JAVA入门】Day47 - 线程 文章目录 【JAVA入门】Day47 - 线程一、并发和并行二、多线程的实现方式2.1 继承 Thread 类的方式2.2 实现 Runnable 接口的方式2.3 利用 Callable 接口实现 三、Thread 类中常见的成员方法四、线程的调度和优先级4.1 抢占式调度4.2 优先级4.3 守护线…

如何不终止容器退出Docker Bash会话

如何不终止容器退出Docker Bash会话 💖The Begin💖点点关注,收藏不迷路💖 当通过docker exec进入Docker容器的bash会话后,如果想退出但不停止容器,可以使用快捷键组合: 按下Ctrl+P然后紧接着按下Ctrl+Q。 这个操作会让你从bash会话中“分离”出来,但容器会继续运行…

Zabbix 部署----安装 Zabbix(监控服务器)

目录 zabbix 官网: 1、准备一台虚拟机 1.整理配置yum源(192.xx.xx.10) 2.设置主机名(192.xx.xx.10) 3.防火墙 4.selinux 2、准备Zabbix-repo 使用阿里提供的zabbixYUM源 3、安装Zabbix服务器 4、初始化数据库 1.安装数据库 2.启动数据库 3.授权zabbix账号 4.初始化…

解决使用nvm ls命令没有出现*的问题

一、引言 在输命令的时候不知道手误写了什么导致node命令用不了&#xff0c;查看环境变量配的nvm对应的路径没问题&#xff0c;试过网上说的修改文件夹名字但是没有用&#xff01;&#xff01; 输入 nvm ls 显示已下载的node版本&#xff0c;发现前面没有* 输入nvm use 使用其中…

【macOS】【zsh报错】zsh: command not found: python

【macOS】【zsh Error】zsh: command not found: python 本地已经安装了Python&#xff0c;且能在Pycharm中编译Python程序并运行。 但是&#xff0c;在macOS终端&#xff0c;运行Python&#xff0c;报错。 首先要确认你在macOS系统下&#xff0c;是否安装了Python。 如果安…

去噪扩散隐式模型

dataset_name "datasets/oxford-102-flowers/" dataset_repetitions 2 # 数据集重复 num_epochs 25 image_size 64 # 模型训练和生成图像的大小 # KID 内核初始距离 kid_image_size 75 # 从噪声中逐步“去噪”或“扩散”到最终图像所需的步骤数。 kid_diffusi…

NEMESIS: NORMALIZING THE SOFT-PROMPT VECTORS OF VISION-LANGUAGE MODELS

文章汇总 发现的现象 动机的描述 Norm增加会导致性能下降&#xff0c;Norm降低会导致性能上升。于是作者提出&#xff1a; 我们需要规范化VLMs中的软提示吗? 实验验证 在左图中的紫色块中可以看到&#xff0c;随着模型性能的上升&#xff0c;Norm value会不断下降。 解决…