Qt on Android:讓 Qt Widgets 和 Qt Quick 應用全螢幕顯示

來源:互聯網
上載者:User

標籤:qt on android   qt quick   android   

    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:圖文詳解Hello World全過程
  • Windows下Qt 5.2 for Android開發入門
  • Qt for Android 部署流程分析
  • Qt on Android:將Qt調試資訊輸出到logcat中
  • Qt on Android: Qt 5.3.0 發布,針對 Android 改進說明
  • Qt on Android Episode 1(翻譯)
  • Qt on Android Episode 2(翻譯)
  • Qt on Android Episode 3(翻譯)
  • Qt on Android Episode 4(翻譯)
  • Qt for Android 編譯純C工程
  • Windows下Qt for Android 編譯安卓C語言可執行程式
  • Qt on Android: Android SDK安裝
  • Qt on Android: http下載與Json解析
  • Qt on Android 之設定應用程式名稱為中文

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.