Qt for Android 開發大坑
Qt for Android 開發大坑
作者: qyvlik
Qt 5.5.1
這裏說一說比較常見的 Qt 開發安卓的大坑。
希望同學們不要做無謂的掙紮,跳過這些坑。
輸入框
首當其沖的是輸入框,Qt 的輸入在安卓上表現不佳.
無法支持安卓原生的輸入法訪問 Qt 的輸入框。就是安卓輸入法無法復制,粘貼,剪切 Qt 輸入框中的文本。
無法支持使用觸摸的方式選中 Qt 輸入框中的文字。
假設輸入框的位置處於應用底部,相似於 IM 那種聊天工具,應當註意。
a. 假設應用
Activity
設置為android:windowSoftInputMode="adjustResize"
b. 假設應用
Activity
設置為android:windowSoftInputMode="adjustPan"
,應用界面的頭部就會被頂出屏幕。為了修復上訴的問題,參照例如以下步驟
a. 先設置應用
Activity
設置為android:windowSoftInputMode="adjustPan"
,這樣。彈出輸入法時,就不由於界面縮放而閃爍。b. 獲取到安卓輸入法高度。
c. 改動輸入框,使其被點擊獲取焦點之前,先彈出輸入法(
Qt.inputMethod.show()
),由於不是輸入框獲取焦點而彈出輸入發。所以界面既不會閃爍,也不會相對屏幕向上位移。(就是在TextField
MouseArea
)d. 在輸入法彈出後,就能夠獲取鍵盤高度(假設在安卓上獲取鍵盤高度,是須要寫一些 Java 代碼的)。
e. 獲取到鍵盤高度後,直接位移輸入框(延時處理),然後
forceActiveFocus
強制獲取焦點。上訴解決方式又引發一個問題,且聽我細細道來。
a. 首先
Qt.inputMethod.show()
在安卓上能夠直接顯示鍵盤。然後顯示時不會直接縮放界面(造成閃爍)或者將界面頂出屏幕。b. 接著,輸入框是一個特殊的控件。在輸入框獲取虛擬鍵的焦點後。安卓上的輸入法會直接記住這個控件的位置。
c. 再下一次直接調用
Qt.inputMethod.show()
為了再解決上訴的問題。還得記錄下安卓上鍵盤的高度,然後依據鍵盤高度決定先使用
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 開發大坑