QT For Android开发-打开PPT文件

news/2024/9/22 12:36:06 标签: qt, android, powerpoint

一、前言

需求: 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_TASK
        
        activity.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.niftyadmin.cn/n/5670261.html

相关文章

Visual Studio 2022

VS&#xff08;Visual Studio&#xff09;是一款由微软开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发应用程序、网站以及移动应用等。VS的历史可以追溯到1997年&#xff0c;当时发布了第一个版本的VS。以下是VS的一些重要历史里程碑&#xff1a; Visual …

【Linux】当前进展

驱动层日志添加了下文件目录&#xff0c;函数&#xff0c;代码行的打印&#xff08;这里要小心&#xff0c;驱动目录源代码打印日志里边添进程号可能有问题&#xff0c;因为在驱动初始化的时候&#xff0c;内核还没有创建进程&#xff0c;不过猜测可以先不打印进程相关信息&…

pg入门11-pg中的publications是什么

在 PostgreSQL&#xff08;PG&#xff09;中&#xff0c;Publication&#xff08;发布&#xff09;是逻辑复制机制中的一个概念&#xff0c;用于定义哪些表的数据变更&#xff08;INSERT、UPDATE、DELETE&#xff09;可以发布到订阅者&#xff08;Subscribers&#xff09;。它主…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

机器学习——Stacking

Stacking&#xff1a; 方法&#xff1a;训练多个模型(可以是强模型)&#xff0c;然后将这些模型的预测结果作为新的特征&#xff0c;输入到下一层新的模型&#xff08;可以是多个&#xff09;中进行训练&#xff0c;从而得到最终的预测结果。 代表&#xff1a;Stacking本身并没…

智能工厂的软件设计 “程序program”表达式,即 接口模型的代理模式表达式

Q1、前面将“智能工厂的软件设计”中绝无仅有的“程序”视为 专注于 给定的某个单一面&#xff08;语言面/逻辑面/数学面&#xff09;中的 问题&#xff0c;专注于分析问题和解决问题的程序活动的组织&#xff0c;每一面都是一个“组织者”就像一个“独角兽”&#xff0c;并提出…

【数据结构】线性数据结构-顺序栈

栈&#xff08;Stack&#xff09;是一种基本的数据结构&#xff0c;具有以下特点&#xff1a; 后进先出&#xff08;LIFO, Last In First Out&#xff09;&#xff1a;栈内的数据项遵循后进先出的原则&#xff0c;即最后存入的项最先被取出。 操作限制&#xff1a;栈通常只允许…

SkyWalking 简介

SkyWalking是什么 skywalking是一个国产开源框架,2015年由吴晟开源 , 2017年加入Apache孵化器。skywalking是分布式系统的应用 程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。它是一款优秀的 APM(Application Performance Manag…