1. 程式人生 > >Qt for Android 開發大坑

Qt for Android 開發大坑

tail target details 之前 ide comm eve 自己 post

Qt for Android 開發大坑

作者: qyvlik

Qt 5.5.1

這裏說一說比較常見的 Qt 開發安卓的大坑。

希望同學們不要做無謂的掙紮,跳過這些坑。

輸入框

首當其沖的是輸入框,Qt 的輸入在安卓上表現不佳.

  1. 無法支持安卓原生的輸入法訪問 Qt 的輸入框。就是安卓輸入法無法復制,粘貼,剪切 Qt 輸入框中的文本。

  2. 無法支持使用觸摸的方式選中 Qt 輸入框中的文字。

  3. 假設輸入框的位置處於應用底部,相似於 IM 那種聊天工具,應當註意。

    a. 假設應用 Activity 設置為 android:windowSoftInputMode="adjustResize"

    ,彈出輸入法時。應用界面就會進行縮放。這個時候。應用界面就會閃爍。

    b. 假設應用 Activity 設置為 android:windowSoftInputMode="adjustPan",應用界面的頭部就會被頂出屏幕。

  4. 為了修復上訴的問題,參照例如以下步驟

    a. 先設置應用 Activity 設置為 android:windowSoftInputMode="adjustPan",這樣。彈出輸入法時,就不由於界面縮放而閃爍。

    b. 獲取到安卓輸入法高度。

    c. 改動輸入框,使其被點擊獲取焦點之前,先彈出輸入法(Qt.inputMethod.show()),由於不是輸入框獲取焦點而彈出輸入發。所以界面既不會閃爍,也不會相對屏幕向上位移。(就是在 TextField

    上放一個 MouseArea

    d. 在輸入法彈出後,就能夠獲取鍵盤高度(假設在安卓上獲取鍵盤高度,是須要寫一些 Java 代碼的)。

    e. 獲取到鍵盤高度後,直接位移輸入框(延時處理),然後 forceActiveFocus 強制獲取焦點。

  5. 上訴解決方式又引發一個問題,且聽我細細道來。

    a. 首先 Qt.inputMethod.show() 在安卓上能夠直接顯示鍵盤。然後顯示時不會直接縮放界面(造成閃爍)或者將界面頂出屏幕。

    b. 接著,輸入框是一個特殊的控件。在輸入框獲取虛擬鍵的焦點後。安卓上的輸入法會直接記住這個控件的位置。

    c. 再下一次直接調用 Qt.inputMethod.show()

    時。會找到上一次獲取焦點的輸入框的位置,依據這個位置,彈出虛擬鍵破並將界面頂出屏幕。然後輸入框才會拿到鍵盤高度。位移。

  6. 為了再解決上訴的問題。還得記錄下安卓上鍵盤的高度,然後依據鍵盤高度決定先使用 Qt.inputMethod.show() 彈出鍵盤,還是先位移輸入框。

    TODO

已經具現化的解決方式GDPURJYFS/WellChat,演示視頻安卓修復鍵盤彈出界面不友善問題修復終版Demo。當然如今這些方案都有各種各樣的問題,詳細要做的。事實上是希望官方修復鍵盤彈出,界面縮放時閃爍的這個問題。

Qt Android 鍵盤問題

攝像頭

Qt 安卓應用上的攝像頭。假設直接使用 QtMultimedia::Camera 可能會出現無法非常好對焦的情況,而且各個機型和不同版本號系統上表現不一致。華為手機對 Qt 的支持不佳,問題會略微多一些。

解決方法:

能夠直接通過調用系統的攝像軟件,詳細參照QtAndroid詳細解釋(3):startActivity實戰Android拍照功能,詳細代碼 A-week-to-develop-android-app-plan/demos/CallNativeCamera。

SplashScreen

啟動屏,據多數 Qter 反映。Qt 安卓應用啟動時。會顯示一個無內容。帶有標題和應用 Icon 的黑色畫面。無法直接預先顯示 SplashScreen。

本地多媒體縮略圖

網絡資源能夠通過現有的 C++ 接口進行優化,緩存。

可是本地多媒體縮略圖支持。須要自行構建一個好用的。

網頁支持

Qt 對移動平臺的網頁支持,應該是試圖通過在 QtSurface 上繪制原生網頁進行支持,所以 Qt 的網頁支持對於移動平臺來說是非常孱弱的。然後 QtWebEngine 是基於谷歌的 Chromium 的,Chromium 如今對 VS 編譯支持最好。Chromium 對 MinGW 的支持基本是沒有的。

如今 Qt 在手機設備上,使用 QtWebView 也就是在 QtSurface 上繪制原生網頁作為 Qt 在移動端上網頁的解決方式。

本地化地圖

QtQuick 中是支持地圖插件的。可是官方僅僅是預制了 here 等幾個國外的地圖插件。百度地圖僅僅能自己去封裝插件。

相關討論有關 QML QtLocation 的 Plugin 的使用問題。

Qt for Android 開發大坑