Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示

Android 系统版本很多,较新的 4.4 ,较老的 2.3 ,都有人用。 Qt on Android 开发的 Android 应用,默认在 Android 设备上是非全屏的。而有些应用的需求是全屏显示,比如游戏。那么怎么样才能做到这点呢?

请给我的决赛文章《Qt Quick 图像处理实例之美图秀秀(附源码下载)》投票,谢谢。

我们需要分 Android 系统版本来说。

Android 2.x

对于 4.0 以前,比如 2.2 、 2.3 的系统,可以修改 AndroidManifest.xml 文件来实现全屏。

首先需要为 Qt on Android 应用生成一个 AndroidManifest.xml 文件,具体参考《 Qt on Android:图文详解Hello World全过程》一文。创建 AndroidManifest.xml 的示意图如下:

点击上图中标号为 7 的那个按钮即可创建一个 AndroidManifest.xml 文件。该文件默认生成在 Qt 项目目录下的 android 子目录内。

然后需要打开 AndroidManifest.xml 文件,找到 Activity 标签,为其加入下面这个属性:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

注意和前、后的其它属性之间留空格。

在 2.x 系统上运行你的 Qt on Android 应用吧,已经全屏了,连标题栏都没有了。

Android 4.x

Android 系统版本到了 4.0 以后,前面那种设置活动主题的方式无效了。我们需要在 Java 代码中为 Activity 设置一个全屏的窗口标记。

这在 Java 撰写的 Android 应用上很简单,只需要在 Activity 的 onCreate() 方法中加入下面的代码:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

可是到了 Qt on Android 应用,就稍微有些复杂了。

一步一步说吧,这次以我们的 Qt Quick App 为例来说明,先参考《Qt Quick 之 Hello World 图文详解》一文创建一个项目,我演示需要,还是以 HelloQtQuickApp 为基础修改的。

先看下修改前的效果图(我在 4.0.3 系统的机顶盒上运行):

注意到图片下方的状态栏了吧。

生成 AndroidManifest.xml

参考上一节吧,把 Activity 的 Theme 属性也设置一下。

为 Qt 项目添加 Java 文件

话说 Qt on Android 应用, Qt 部分的代码以 JNI 的方式经由 Java 代码启动的。为了能够启动 Qt 代码,进入 Qt 的世界, Qt 框架提供了 QPA 层以及必要的 Activity 、 Application 实现。详情参考《Qt on Android Episode 1(翻译)》和《Qt for Android 部署流程分析》两篇文章。

这里以 Qt 5.2.0 为例来作一简单说明。

QtActivity 简析

如果你观察 AndroidManifest.xml 文件,会发现里面的 Activity 标签,指定的 activity 名字是:"org.qtproject.qt5.android.bindings.QtActivity" 。没错,就是它!它是由 Qt 框架提供的,你 Qt on Android 应用的入口。 QtActivity 的位置在这里:

c:\qt\Qt5.2.0\5.2.0\android_armv5\src\android\java\src\org\qtproject\qt5\android\bindings\QtActivity.java

感兴趣的可以打开这个 Java 文件研究一下。

下面是 QtActivity.java 的 onCreate 函数的摘录:

...
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        try {
            setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (Build.VERSION.SDK_INT > 10) {
            try {
                requestWindowFeature(Window.class.getField("FEATURE_ACTION_BAR").getInt(null));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }
    ...
    }
...

如你所见, QtActivity 区分了 SDK 版本, 10 以上的请求 FEATURE_ACTION_BAR 特性, 10 以下(Android 2.3及以下)的版本不要 title (太难看了,只显示应用名字,木啥用)。

你懂的,  Qt Creator 可以编译 Java 源码(通过调用 Ant ), QtActivity 就是这样编译到你的 APK 中的。所以,我们也可以添加自己的 Java 代码喽。

我们要添加全屏标记,需要继承 QtActivity 类来实现一个新的 Activity 。当然如果你想粗暴地解决这个问题,可以直接修改 QtActivity.java ,直接加一行代码即可。什么代码?看下面。

实现QtFullscreenActivity

QtFullscreenActivity 继承自 QtActivity 类,代码非常简单。如下:

package an.qt.helloQtQuickApp;
import android.content.Context;
import android.content.Intent;
import android.app.PendingIntent;
import android.util.Log;
import android.os.Bundle;
import android.view.WindowManager;

public class QtFullscreenActivity extends org.qtproject.qt5.android.bindings.QtActivity
{
    private final static String TAG = "QtFullscreen";
    @Override
    public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
}

上面代码中 "getWindow()" 起始的那行,就是设置全屏标记的。

添加 QtFullscreenActivity 到 pro 文件

我把 QtFullscreenActivity.java 文件放在了 android/src/an/qt/helloQtQuickApp/ 下面,所以 pro 文件中相关的部分是酱紫的:

OTHER_FILES +=     android/AndroidManifest.xml     android/src/an/qt/helloQtQuickApp/QtFullscreenActivity.java

需要注意的是, Java 代码中的包名(QtFullscreenActivity第一行),和路径是严格匹配的, Java类名则和源代码文件名严格匹配。

然后你可以看到下面的项目视图了:

修改 AndroidManifest.xml

这是改动的最后一步了。

我们实现的 Activity 名字是 QtFullscreenActivity ,所以呢, AndroidManifest.xml 文件中也要修改,保持一致。见下面:

<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:installLocation="auto"
    package="an.qt.helloQtQuickApp"
    android:versionName="1.0">
    <application
        android:name="org.qtproject.qt5.android.bindings.QtApplication"
        android:label="@string/app_name">
        <activity
            android:name="an.qt.helloQtQuickApp.QtFullscreenActivity"
            android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:label="@string/app_name"
            android:screenOrientation="unspecified">
            <intent-filter>
...
</manifest>

好啦,到此为止,全部改动就绪。运行我们的 HelloQtQuickApp 吧。

下面是现在运行的效果:

好啦,到此结束。

请给我的决赛文章《Qt Quick 图像处理实例之美图秀秀(附源码下载)》投票,谢谢。

本系列的其他文章:

Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示

时间: 2024-10-25 18:09:10

Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示的相关文章

QT 全屏显示子窗口

QT 中全屏显示子窗口的方法 QT 中窗口部件 QWidget 成员函数 showFullScreen();是用于将窗口部件全屏显示 但是他只对窗口模式的部件有用.子窗口的特征是 Qt::SubWindow不是独立的窗 口.因此对其调用 showFullScreen无效.通过对子窗口调用setWindowFlags Qt: :Dialog或 setWindowFlagsQt::Window将其设为窗口模式后即可 调用 showFullScreen();进行全屏显示了. 相对于子窗口的全屏显示方法

QT中关于窗口全屏显示与退出全屏的实现

近期在学习QT时遇到了很多问题这也是其中一个,个人通过在各种书籍和网络上的查阅找到了一些关于这方面的答案,希望能给大家一些帮助. 首先,在QT中对于窗口显示常用的有这么几个方法可以调用: Qt全屏显示函数            showFullScreen() Qt最大化显示函数         showMaximized()Qt最小化显示函数         showMinimized()Qt固定尺寸显示函数      resize(x,y)Qt设置最大尺寸函数      setMaximum

Qt中子窗口全屏显示与退出全屏

在Qt开发中偶尔遇到子窗口全屏显示和退出全屏的功能需求,是一种比较正常的情况,首先,我们需要知道子窗口全屏显示与退出全屏主要会调用的方法有哪些,下面将列举此过程主要调用的方法: isFullScreen():判断窗口当前是处于全屏状态还是非全屏状态 setWindowFlags(Qt::WindowFlags type):设置窗口属性 showFullScreen():设置窗口全屏显示 showNormal():设置窗口恢复原来显示(Restores the widget after it ha

Android中界面实现全屏显示的两种方式

在开发android的应用当中,我们会遇到将一些界面设置为全屏显示的格式,有两种实现的方法.其一是在Java代码中实现,其二是在配置文件中实现. 1. 在Java代码中设置 super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //无title getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, Window

Android应用程序全屏显示方法

导入两个包: import android.view.Window; import android.view.WindowManager; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(W

Android 全屏显示的方法(不包含状态栏)

我们都知道在Android中某些功能的实现往往有两种方法:一种是在xml文件中设置相应属性,另一种是用代码实现.同样Android实现全屏显示也可以通过这两种方法实现: 1.在AndroidManifest.xml的配置文件里面的<activity>标签添加属性: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 2.在Activity的onCreate()方法中的super()和setContentVie

Android - 设置ImageView为全屏显示

设置ImageView为全屏显示 本文地址: http://blog.csdn.net/caroline_wendy ImageView默认会适应屏幕大小, 如果想使用全屏填充, 则需要使用: android:scaleType="fitXY" android:scaleType="matrix" 注意android:scaleType的参数选择. 参考: http://developer.android.com/reference/android/widget/I

Android 全屏显示 and 取消标题栏

先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 注意这句一定要写在setContentView()方法的前面,不然会报错的 第二种:在AndroidManifest.xml文件中定义 <application android:icon="@drawable/icon" android:label="@string/app_name"

Android浏览图片,点击放大至全屏效果

最近做一个项目类似于QQ空间,做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果很赞,于是也做了个类似的效果.如下. 我不知道QQ那个是怎么做的,我的思路如下: 首先,从图片缩略界面跳转到图片详情页面,应该是从一个Activity跳转到另外一个Activity,应该图片详情页面也有很多操作,用View或者Dialog不是很好.所以现在难点就是,如何使得前一个界面的ImageView在另外一个界面做缩放切割动画. 一般缩略界面的ImageView的是如上图所示的正方形的,并且是CENT