"модуль" QtQuick "не установлен" (портирование Android)
Я пытаюсь портировать свое приложение на Android с помощью qt5.4, но у меня есть эта ошибка:
W / Qt (30916): qrc: /qml/FrontEnd.qml: 1 ((null)): qrc: /qml/FrontEnd.qml: 1: 1: модуль "QtQuick" не установлен
Это мой.pro
TEMPLATE = app
TARGET = sandbox-build-android
QT+= qml quick widgets printsupport xml svg
INCLUDEPATH += [...]# my include path
# Input
HEADERS += [...] # my include
SOURCES += [...] # my source
RESOURCES += ../sandbox/resources.qrc
LIBS += -L$$PWD/../../edalab/else-datamodel-classes/build-buildAndroid-Android_for_armeabi_v7a_GCC_4_9_Qt_5_4_0-Debug/ -lbuildAndroid
INCLUDEPATH += [...]
DEPENDPATH += [...]
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
ANDROID_EXTRA_LIBS = [..]
}
# Default rules for deployment.
include(deployment.pri)
Это мое развертывание.
android-no-sdk {
target.path = /data/user/qt
export(target.path)
INSTALLS += target
} else:android {
x86 {
target.path = /libs/x86
} else: armeabi-v7a {
target.path = /libs/armeabi-v7a
} else {
target.path = /libs/armeabi
}
export(target.path)
INSTALLS += target
} else:unix {
isEmpty(target.path) {
qnx {
target.path = /tmp/$${TARGET}/bin
} else {
target.path = /opt/$${TARGET}/bin
}
export(target.path)
}
INSTALLS += target
}
export(INSTALLS)
В моем FrontEnd.qml у меня есть этот импорт:
import QtQuick 2.4
import QtQuick.Controls 1.3
Я не вижу существенных отличий от.pro примера проекта, который работает должным образом на Android.
ОБНОВИТЬ
Я увидел другой пример "Календарь" и заметил, что мне не хватает этого флага "OTHER_FILES", поэтому я добавил в него все пути к моим файлам QML, но проблема сохраняется.
Я также получил apk со своего смартфона, и я извлек содержимое. Я заметил, что мой apk не включает некоторые библиотеки, которые присутствуют в примере apk, который работает:
libqml_Qt_labs_folderlistmodel_libqmlfolderlistmodelplugin.so libqml_Qt_labs_settings_libqmlsettingsplugin.so libqml_QtQml_Models.2_libmodelsplugin.so libqml_QtQml_StateMachine_libqtqmlstatemachine.so libqml_QtQuick.2_libqtquick2plugin.so libqml_QtQuick_Controls_libqtquickcontrolsplugin.so libqml_QtQuick_Controls_Styles_Android_libqtquickcontrolsandroidstyleplugin.so libqml_QtQuick_Dialogs_libdialogplugin.so libqml_QtQuick_Dialogs_Private_libdialogsprivateplugin.so libqml_QtQuick_Layouts_libqquicklayoutsplugin.so libqml_QtQuick_Window.2_libwindowplugin.so
Структура моего каталога
.
├── Project1
│ ├── file.pro
│ ├── images
│ │ ├── ...
│ ├── include
│ │ ├── sub1
│ │ │ ├── file1.hh
│ │ │ └── sub1.1
│ │ │ └── file2.hh
│ │ └── sub2
│ │ └── file3.hh
│ ├── qml
│ │ ├── file1.qml
│ │ └── sub1
│ │ ├── file2.qml
│ │ └── sub1.1
│ │ └── file3.qml
│ ├── README.txt
│ ├── resources.qrc
│ ├── src
│ │ ├── sub1
│ │ │ ├── file1.cc
│ │ │ └── sub1.1
│ │ │ └── file2.cc
│ │ ├── sub2
│ │ │ └── file3.cc
│ │ └── Main.cc
│ └── webUtils
│ └── file.html
1 ответ
Вот пример .pro
файл. Я выбрал слишком специфические вещи. Структура каталогов выглядит следующим образом:
.
├── Project
│ ├── app.pro
| ├── android
| │ ├── res
| | │ ├── drawable-hdpi
| | | └── ...
| | ├── AndroidManifest
│ ├── content
│ │ ├── file1.qml
│ │ └── ...
| ├── icons
│ ├── images
│ │ ├── ...
| ├── include
│ │ ├── sub1
│ │ │ ├── file1.hh
│ │ │ └── sub1.1
│ │ │ └── file2.hh
│ │ └── sub2
│ │ └── file3.hh
| ├── ios
| | └── Info.plist
| ├── libs
| | ├── droid
| | ├── ios
| | ├── macx
| | ├── nix
| | ├── win
| | └── winphone
│ ├── Qml.qrc
| ├── Resources.qrc
| ├── SubProject
| ├── translations
| | ├── app_en.qm
| | ├── ...
│ ├── [.cpp]
| ├── [.h]
| ├── app_en.ts
В отличие от вас у меня нет src
Дир и QML
файлы перемещаются в content
каталог. Я также файл ресурсов для того же QML
файлы, т.е. Qml.qrc
, Файлы перевода (ака .ts
файлы) содержатся в основном каталоге с источниками. Скомпилированные переводы (ака .qm
) файлы вместо этого находятся в подкаталоге translations
,
Каталог android
а также ios
содержат файлы, специфичные для платформ, в частности, у нас есть res
Каталог полезен для предоставления иконки и обоев для приложения для платформы Android. Такой же android
dir используется как источник пакета APK (см. .pro
ниже). ios
Каталог содержит список свойств.
lib
Каталог содержит вложенный каталог для каждой платформы с перекомпилированной библиотекой для этой среды.
Вот соответствующий файл проекта:
TEMPLATE = app
macx:CONFIG += app_bundle
# QT IMPORT
QT += gui qml quick [...]
#include subproject
include(SubProject/subproject.pri)
# Default rules for deployment
include(deployment.pri)
# Compilation flags [specific to the different OSs]
include(flags.pri)
TARGET = "appName" # just needed for me since I change target between "App" and "AppPRO"
INCLUDEPATH += [...]
$$PWD/include/sub1 \
$$PWD/include/sub2
!isEmpty(QMAKE_LFLAGS_RPATH):LIBS += \
$$QMAKE_LFLAGS_RPATH$${TOP_BUILD_DIR}/lib #(UNIX ONLY): libs linked preferibly at runtime
# DESKTOP PLATFORMS
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/win/ -lLIBNAME1
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/win/ -lLIBNAMEd
unix:!macx:!ios:!android: LIBS += -L$$PWD/lib/nix -lLIBNAME
macx: LIBS += -L$$PWD/lib/macx/ -lLIBNAME
# MOBILE PLATFORMS
ios: LIBS += -L$$PWD/lib/ios -lLIBNAME
android: LIBS += -L$$PWD/lib/droid -lLIBNAME
winphone: LIBS += -L$$PWD/lib/winphone/ -lLIBNAME
# ADDITIONAL ANDROID SETTING
ANDROID_EXTRA_LIBS = $$PWD/lib/droid/libLIBNAME.so
# SOURCE FILES (.CPP)
SOURCES += [.cpp]
# HEADER FILES (.H)
HEADERS += [.h]
# objective-c++ sources for ios platform
ios {
QT += gui_private
#QT -= printsupport
HEADERS += [.h]
OBJECTIVE_SOURCES += [.mm]
}
# QML sources are added here!
RESOURCES += Resources.qrc \
Qml.qrc
# ANDROID ADDITION
android {
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android # contains the dir structure of the APK, actually it contains just res
OTHER_FILES += androidPro/AndroidManifest.xml # <--- manifest for the Pro version
}
#### ICONS SECTION ####
win32:RC_ICONS += $$ICON_PATH/multiIcon.ico # ICONS for WIN
mac:!ios:ICON = $$ICON_PATH/icons.icns # ICONS for MAC
#IOS BUNDLE # ICONS for IOS
ios {
BUNDLE_DATA.files = [...]
QMAKE_BUNDLE_DATA += BUNDLE_DATA
QMAKE_INFO_PLIST = $$PWD/ios/Info.plist
}
# list QML sources for linguist purposes
lupdate_only{
SOURCES = *.qml \
*.js \
content/*.qml \
content/*.js
}
# and the .ts file for translation!
TRANSLATIONS = app_en.ts \
app_fr.ts \
app_de.ts \
app_sp.ts \
app_en.ts
Это manifest
, Qt Creator позволяет редактировать через интерфейс пользовательского интерфейса или текстовое редактирование. Чтобы добавить манифест (Qt Creator 3.3), как указано в комментариях, просто перейдите в Projects > Build > Build Android APK > Create Templates
,
<?xml version="1.0"?>
<manifest android:versionCode="21" android:installLocation="auto" package="JAVA_PACKAGE" android:versionName="1.0.12" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:hardwareAccelerated="true" android:label="@string/app_name" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:icon="@drawable/icon">
<activity android:screenOrientation="unspecified" android:label="@string/app_name" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data android:value="app" android:name="android.app.lib_name"/>
<meta-data android:resource="@array/qt_sources" android:name="android.app.qt_sources_resource_id"/>
<meta-data android:value="default" android:name="android.app.repository"/>
<meta-data android:resource="@array/qt_libs" android:name="android.app.qt_libs_resource_id"/>
<meta-data android:resource="@array/bundled_libs" android:name="android.app.bundled_libs_resource_id"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --" android:name="android.app.bundle_local_qt_libs"/>
<meta-data android:resource="@array/bundled_in_lib" android:name="android.app.bundled_in_lib_resource_id"/>
<meta-data android:resource="@array/bundled_in_assets" android:name="android.app.bundled_in_assets_resource_id"/>
<!-- Run with local libs -->
<meta-data android:value="-- %%USE_LOCAL_QT_LIBS%% --" android:name="android.app.use_local_qt_libs"/>
<meta-data android:value="/data/local/tmp/qt/" android:name="android.app.libs_prefix"/>
<meta-data android:value="-- %%INSERT_LOCAL_LIBS%% --" android:name="android.app.load_local_libs"/>
<meta-data android:value="-- %%INSERT_LOCAL_JARS%% --" android:name="android.app.load_local_jars"/>
<meta-data android:value="-- %%INSERT_INIT_CLASSES%% --" android:name="android.app.static_init_classes"/>
<!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<!-- Messages maps -->
<!-- Splash screen -->
<meta-data android:resource="@drawable/splash" android:name="android.app.splash_screen_drawable"/>
<!-- Splash screen -->
</activity>
</application>
<uses-sdk android:targetSdkVersion="19" android:minSdkVersion="9"/>
<supports-screens android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" android:largeScreens="true" android:anyDensity="true"/>
<!-- %%INSERT_PERMISSIONS -->
<!-- %%INSERT_FEATURES -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>