当前位置: 首页 > 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文件。

相关文章:

QT For Android开发-打开PPT文件

一、前言 需求&#xff1a; Qt开发Android程序过程中&#xff0c;点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件&#xff0c;非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…...

SpringBoot教程(三十) | SpringBoot集成Shiro权限框架

SpringBoot教程&#xff08;三十&#xff09; | SpringBoot集成Shiro权限框架 一、 什么是Shiro二、Shiro 组件核心组件其他组件 三、流程说明shiro的运行流程 四、SpringBoot 集成 Shiro &#xff08;shiro-spring-boot-web-starter方式&#xff09;1. 添加 Shiro 相关 maven2…...

[ffmpeg] 视频格式转换

本文主要梳理 ffmpeg 中的视频格式转换。由于上屏的数据是 rgba&#xff0c;编码使用的是 yuv数据&#xff0c;所以经常会使用到视频格式的转换。 除了使用 ffmpeg进行转换&#xff0c;还可以通过 libyuv 和 directX 写 shader 进行转换。 之前看到文章说 libyuv 之前是 ffmpeg…...

git-repo系列教程(3) git-repo https证书认证问题

文章目录 问题描述解决步骤1.下载证书2.测试证书是否正常3.设置环境变量 总结 问题描述 在使用git repo 同步仓库时,发现不能同步,出现如下提示错误: % Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left …...

中序遍历二叉树全过程图解

文章目录 中序遍历图解总结拓展&#xff1a;回归与回溯 中序遍历图解 首先看下中序遍历的代码&#xff0c;其接受一个根结点root作为参数&#xff0c;判断根节点是否为nil&#xff0c;不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …...

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样&#xff0c;可以在不知道对象具体类型的条…...

在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路

什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress&#xff0c;添加相关配置文件&#xff0c;选择主题&#xff0c;描述&#xff0c;框架等 npx vitepress init //…...

神经网络面试题目

1. 批规范化(Batch Normalization)的好处都有啥&#xff1f;、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是&#xff1a;A 解析&#xff1a; ‌‌‌‌  batch normalization 就…...

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况&#xff0c;而本道题是出现两个单身狗的情况。根据一个数…...

Vue2学习笔记(03关于VueComponent)

1.school组件本质是一个名为Vuecomponent的构造函数&#xff0c;且不是程序员定义的&#xff0c;是Vue.extend生成的。 2.我们只需要写<school/>或<school></school>&#xff0c;Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new Vuecompo…...

微服务架构中常用技术框架

认证授权 Spring Security OAuth 2.0 JWT Keycloak Istio Apache Shiro 日志监控 ELK Prometheus Grafana Fluentd CI/CD Jenkins GitLab CI CircleCI ArgoCD 服务通信 gRPC REST API Apache Thrift Apache Avro Apache Dubbo OpenFegin 断路器 Hystr…...

[深度学习]Pytorch框架

1 深度学习简介 应用领域:语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年,chatGPT出现,进入AIGC发展阶段3 PyTorch框架简…...

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发&#xff0c;可在终端设备的通知中心、锁屏、横幅等展示&#xff0c;用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容&#xff0c;将通知消息分类为服务与通讯、资讯营销两大类别&…...

[Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露

信息收集 IP AddressOpening Ports10.10.10.125TCP:135, 139, 445, 1433, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670, 49671 $ nmap -p- 10.10.10.125 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrp…...

新版ssh客户端无法连接旧版服务器sshd的方法

新安装完的windows 版本&#xff0c;连Linux服务器直接报错 C:\Users\wang>ssh root192.168.110.50 Unable to negotiate with 192.168.110.50 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,kex…...

MyBatis操作数据库-XML实现

目录 1.MyBatis的简单介绍 2.MyBatis操作数据库的步骤 2.1 添加依赖 2.2 配置文件 2.3 写持久层代码 2.4 方法测试 3.MyBatis操作数据库(增删查改) 3.1 CRUD标签 3.2 参数传递 3.3 Insert-新增 3.4 Delete-删除 3.5 Update-修改 3.6 Select-查询(映射问题) 1.MyB…...

华为HarmonyOS地图服务 5 - 利用UI控件和手势进行地图交互

场景介绍 本章节将向您介绍如何使用地图的手势。 Map Kit提供了多种手势供用户与地图之间进行交互&#xff0c;如缩放、滚动、旋转和倾斜。这些手势默认开启&#xff0c;如果想要关闭某些手势&#xff0c;可以通过MapComponentController类提供的接口来控制手势的开关。 接口…...

解决DockerDesktop启动redis后采用PowerShell终端操作

如图&#xff1a; 在启动redis容器后&#xff0c;会计入以下界面 &#xff1a; 在进入执行界面后如图&#xff1a; 是否会觉得界面过于单调&#xff0c;于是想到使用PowerShell来操作。 步骤如下&#xff1a; 这样就能使用PowerShell愉快地敲命令了&#xff08;颜值是第一生…...

react + antDesign封装图片预览组件(支持多张图片)

需求场景&#xff1a;最近在开发后台系统时经常遇到图片预览问题&#xff0c;如果一个一个的引用antDesign的图片预览组件就有点繁琐了&#xff0c;于是在antDesign图片预览组件的基础上二次封装了一下&#xff0c;避免重复无用代码的出现 效果 公共预览组件代码 import React…...

逻辑回归 和 支持向量机(SVM)比较

为了更好地理解为什么在二分类问题中使用 SVM&#xff0c;逻辑回归的区别&#xff0c;我们需要深入了解这两种算法的区别、优势、劣势&#xff0c;以及它们适用于不同场景的原因。 逻辑回归和 SVM 的比较 1. 模型的核心思想 • 逻辑回归&#xff1a; • 基于概率的模型&…...

WarcraftHelper:突破经典游戏限制的焕新体验工具

WarcraftHelper&#xff1a;突破经典游戏限制的焕新体验工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 当你在4K显示器上启动《魔兽争霸III》时&…...

CSDN程序员副业图谱技术文章推荐

CSDN程序员副业图谱技术文章推荐CSDN作为国内知名的技术社区&#xff0c;收录了大量关于程序员副业和技术图谱的文章。以下是一些相关的高质量中文文献和技术资源&#xff1a;程序员副业方向《程序员如何开启副业&#xff1a;技术变现的多种途径》《技术副业实战&#xff1a;从…...

数据分析师课程

数据分析是什么定义&#xff1a;运用统计分析方法对收集的数据进行汇总、理解和消化&#xff0c;最大化开发数据功能数据形式&#xff1a;观测值通过实验/测量获得&#xff0c;常以图表或表格呈现分类体系&#xff1a;描述性分析&#xff08;初级&#xff09;&#xff1a;占日常…...

别只比功能了!从社区生态和未来路线图,聊聊Spring AI和LangChain4j谁更值得押注

从社区生态与战略布局看Spring AI与LangChain4j的长期价值 当技术决策者面对两个功能相近的开源项目时&#xff0c;功能对比表格往往只是决策的起点。真正决定技术选型成败的&#xff0c;是项目背后的社区活力、维护模式与长期演进路线。Spring AI与LangChain4j作为Java生态中两…...

2025届学术党必备的六大AI辅助论文方案解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 将人工智能技术应用于内容创作领域的重要的AI写作软件&#xff0c; 正逐渐改变传统写作模式&…...

知识竞赛在党建教育中的创新应用:激活学习动能,赋能组织活力

引言&#xff1a;党建教育需要新载体在新时代背景下&#xff0c;党建教育工作面临着党员群体年轻化、信息获取渠道多元化、学习需求个性化等新挑战。传统的单向宣讲、文件学习模式有时难以充分激发党员的学习热情和深度参与。因此&#xff0c;探索形式新颖、互动性强、富有时代…...

多模态探索:OpenClaw+Qwen3-4B分析截图中的文字与图表数据

多模态探索&#xff1a;OpenClawQwen3-4B分析截图中的文字与图表数据 1. 为什么需要自动化处理截图数据 作为一名经常需要处理学术论文的研究者&#xff0c;我长期被一个问题困扰&#xff1a;当阅读PDF论文时&#xff0c;遇到有价值的图表数据&#xff0c;传统方法只能手动录…...

questasim2024.1 wsl2 ubuntu22.04 安装

之前一直在 wsl 2 上用 vcs 进行仿真&#xff0c;但是最近想看一下覆盖率&#xff0c;发现破解有些问题&#xff0c;看不了&#x1f605;。而且 vcs 老给我报错说系统不兼容&#xff0c;让我很是恼火。开源的 verilator 的验证逻辑又和传统的工具有一些区别&#xff0c;不能完全…...

云安全部署防护成为企业刚需,合规+高效部署指南

企业上云已从可选变为必选项&#xff0c;公有云、私有云、混合云的广泛应用&#xff0c;让企业IT架构更敏捷、成本更可控&#xff0c;但与此同时&#xff0c;云环境的安全风险也呈爆发式增长。Gartner预测&#xff0c;到2025年&#xff0c;99%的云安全事件将由客户配置错误引发…...

从双摄手机到自动驾驶:对极几何(Epipolar Geometry)在现实世界中的5个应用场景

从双摄手机到自动驾驶&#xff1a;对极几何在现实世界中的5个应用场景 当你用手机拍摄人像模式照片时&#xff0c;是否好奇过背景虚化效果如何精准识别主体&#xff1f;当自动驾驶汽车在复杂路况中穿行&#xff0c;又是如何判断前方障碍物的距离&#xff1f;这些看似神奇的技术…...