2013-08-19 28 views
9

Tôi đang cố gắng nhập TimeExample Qt Quick Extension Plugin từ cài đặt Android Qt 5.1.0.Làm thế nào để triển khai qt5 qml plugin cho android?

libqmlqtimeexampleplugin.so được xây dựng thành công trong build-plugins-Android_for_arm_GCC_4_6_Qt_5_1_0-Debug/imports

Sau đó, tôi tạo ra đơn giản Qt Quick2 Application (built-in Elements) từ Qt Creator. Tôi nên thêm gì vào tệp dự án ứng dụng để có được plugin QML trong gói ".apk" đầu ra?

Bây giờ nó nói:

W/Qt (23.528): Tài sản: /qml/TimeExampleTest/main.qml: 2(): Tài sản: /qml/TimeExampleTest/main.qml: 2: 1 : mô-đun "TimeExample" không được cài đặt

main.qml

import QtQuick 2.0 

import TimeExample 1.0 // import types from the plugin 

Rectangle { 
    width: 360 
    height: 360 
    Text { 
     text: qsTr("Hello World") 
     anchors.centerIn: parent 
    } 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      Qt.quit(); 
     } 
    } 

    Clock { // this class is defined in QML (imports/TimeExample/Clock.qml) 

     Time { // this class is defined in C++ (plugin.cpp) 
      id: time 
     } 

     hours: time.hour 
     minutes: time.minute 

    } 
} 

TimeExampleTest.pro

folder_01.source = qml/TimeExampleTest 

folder_01.target = qml 

folder_02.source = /home/artem/Projects/Veedo/Test/build-plugins-Android_for_arm_GCC_4_6_Qt_5_1_0-Debug/imports/TimeExample 

folder_02.target = imports 

DEPLOYMENTFOLDERS = folder_01 folder_02 

QML_IMPORT_PATH = /home/artem/Projects/Veedo/Test/build-plugins-Android_for_arm_GCC_4_6_Qt_5_1_0-Debug/imports/TimeExample 

SOURCES += main.cpp 

include(qtquick2applicationviewer/qtquick2applicationviewer.pri) 

qtcAddDeployment() 

OTHER_FILES += \ 
    android/src/org/kde/necessitas/ministro/IMinistro.aidl \ 
    android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl \ 
    android/src/org/qtproject/qt5/android/bindings/QtActivity.java \ 
    android/src/org/qtproject/qt5/android/bindings/QtApplication.java \ 
    android/AndroidManifest.xml \ 
    android/version.xml \ 
    android/res/values-ja/strings.xml \ 
    android/res/values-rs/strings.xml \ 
    android/res/values-zh-rTW/strings.xml \ 
    android/res/values-fa/strings.xml \ 
    android/res/values-ru/strings.xml \ 
    android/res/values-fr/strings.xml \ 
    android/res/values-ro/strings.xml \ 
    android/res/values-el/strings.xml \ 
    android/res/values-ms/strings.xml \ 
    android/res/values-nb/strings.xml \ 
    android/res/values-et/strings.xml \ 
    android/res/values-pl/strings.xml \ 
    android/res/values-pt-rBR/strings.xml \ 
    android/res/values-es/strings.xml \ 
    android/res/values-id/strings.xml \ 
    android/res/values-de/strings.xml \ 
    android/res/values-it/strings.xml \ 
    android/res/values-zh-rCN/strings.xml \ 
    android/res/values/strings.xml \ 
    android/res/values/libs.xml \ 
    android/res/layout/splash.xml \ 
    android/res/values-nl/strings.xml 

Trả lời

6

Với Qt 5.3, chúng tôi đã quản lý để nhận plugin QML của chúng tôi được ứng dụng Android Qt chỉ nhận bằng cách triển khai plugin vào thư mục QT_INSTALL_QML nơi mô-đun QML Qt chính thức cư trú. Thư mục này là /opt/Qt/5.3/android_armv7/qml trong trường hợp của chúng tôi.

Plugin Side

tập tin .pro của chúng tôi cho các plugin trông giống như:

TEMPLATE = lib 
TARGET = prova 
QT += qml quick multimedia 
CONFIG += qt plugin c++11 console 
CONFIG -= android_install 
TARGET = $$qtLibraryTarget($$TARGET) 
uri = com.mycompany.qmlcomponents 

# Input 
SOURCES += \ 
    src1.cpp \ 
    src2.cpp 

HEADERS += \ 
    src1.h \ 
    src2.h 

##The below is generated automatically by Qt Creator when you create a new "Qt Quick 2 Extension Plugin" project for Android 

#Copies the qmldir file to the build directory 
!equals(_PRO_FILE_PWD_, $$OUT_PWD) { 
    copy_qmldir.target = $$OUT_PWD/qmldir 
    copy_qmldir.depends = $$_PRO_FILE_PWD_/qmldir 
    copy_qmldir.commands = $(COPY_FILE) \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\" 
    QMAKE_EXTRA_TARGETS += copy_qmldir 
    PRE_TARGETDEPS += $$copy_qmldir.target 
} 

#Copies the qmldir file and the built plugin .so to the QT_INSTALL_QML directory 
qmldir.files = qmldir 
unix { 
    installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) 
    qmldir.path = $$installPath 
    target.path = $$installPath 
    INSTALLS += target qmldir 
} 

qmldir (trong thư mục gốc cây nguồn plugin) tập tin của chúng tôi là:

module com.mycompany.qmlcomponents 
plugin prova 

Application Bên

File .pro trông giống như:

TEMPLATE = app 

QT += qml quick widgets multimedia 

CONFIG+= console 
SOURCES += main.cpp 

RESOURCES += qml.qrc 

# Additional import path used to resolve QML modules in Qt Creator's code model 
QML_IMPORT_PATH = 
# Default rules for deployment. 
include(deployment.pri) 

contains(ANDROID_TARGET_ARCH,armeabi-v7a) { 
    ANDROID_EXTRA_LIBS = \ 
     /opt/Qt/5.3/android_armv7/qml/com/mycompany/qmlcomponents/libprova.so 
} 

Chúng tôi không thực sự biết nếu sự bao gồm của libprova.so thêm là cần thiết. Nó có lẽ là không.

Các main.cpp trông giống như:

#include <QApplication> 
#include <QQmlApplicationEngine> 
int main(int argc, char *argv[]){ 
    QApplication app(argc, argv); 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:///main.qml"))); 
    return app.exec(); 
} 

Các main.qml chỉ bao gồm các plugin như:

import QtQuick 2.2 
import QtQuick.Controls 1.1 
import QtMultimedia 5.0 

import com.mycompany.qmlcomponents 1.0 

... 

Xây dựng và triển khai

Cách chúng tôi xây dựng và triển khai các plugin là qmake (từ chuỗi công cụ android-armv7 của Qt), sau đó make install. Nó cài đặt tệp qmldir và plugin .so vào thư mục QT_INSTALL_QML.

Cách chúng tôi tạo và triển khai dự án sử dụng plugin là qmake (một lần nữa, từ chuỗi công cụ android-armv7 của Qt), sau đó make install INSTALL_ROOT=. (cài đặt để xây dựng thư mục), sau đó chạy androiddeployqt.Lệnh cuối cùng tạo cấu trúc dự án Android với qmldirs trong tài sản/và thư viện trong libs/và bó toàn bộ thứ trong một gói ứng dụng qua ant. Để biết chi tiết về quy trình này, hãy tham khảo http://qt-project.org/wiki/Android.

Tóm lại, chúng tôi chỉ có thể nhận được plugin QML của chúng tôi được công nhận bên trong một dự án Android bằng cách đặt nó vào thư mục Qt qml riêng tư.

+0

Thú vị, nhưng iirc có cách đơn giản hơn nhiều, tôi có thể khai thác/thử một số mã nếu bạn quan tâm. – mlvljr

+0

Tôi quan tâm đến @mlvljr! – user981733

+0

@ user981733 OK, hãy để tôi xem xét điều này trong những ngày sau đó :) – mlvljr

0

Sau khi đọc nguồn Qt về QAbstractFileEngineHandler, tôi thấy một cái gì đó xấu xí trong Qt:

  1. Qt không thực hiện một số loại cơ chế để cung cấp "searchpath" (không phải URL) như "QRC:", "tài sản: ", trong đó hạt nhân là QAbstractFileEngineHandler.

  2. QAbstractFileEngineHandler trở nên không còn công trong Qt5, nó chỉ cung cấp trừu tượng để QFile, QFileInfo, QDir, QIcon, và những thứ được cung cấp bởi QFile, bao gồm QImage, cộng QAndroidAssetsFileEngineHandler, đó là chuyên ngành đối với tài sản Android.

  3. Vì vậy lược đồ SearchPath không tương thích với QUrl ngay cả khi chúng trông rất giống nhau, như bạn biết QtQuick được đặtSource thành một số URL, do đó, tệp qml sẽ không được nạp tiền tố "asset:" trực tiếp.

  4. Bạn có thể tìm thấy dưới đây [static] void QDir::setSearchPaths(const QString &prefix, const QStringList &searchPaths) trong tài liệu Qt của:

    QDir::setSearchPaths("icons", QStringList(QDir::homePath() + "/images")); 
    QDir::setSearchPaths("docs", QStringList(":/embeddedDocuments")); 
    
    ...  
    QPixmap pixmap("icons:undo.png"); // will look for undo.png in QDir::homePath() + "/images"  
    QFile file("docs:design.odf"); // will look in the :/embeddedDocuments resource path 
    

    Bạn sẽ tìm thấy đoạn này không làm việc vì QPixmap không tải hình ảnh từ QAbstractFileEngineHandler, điều này có thể thay đổi không có giấy tờ Qt của. Mặt khác, QtCore đơn vị kiểm tra về searchpath chỉ thử nghiệm trên QFile

Hơn nữa, void addResourceSearchPath(const QString &path) là lỗi thời, tuy nhiên setSearchPath là khiếm khuyết, tôi cảm thấy khá bối rối về vấn đề này. Có lẽ tôi nên xem qua QUrl ngay bây giờ :)

Các vấn đề liên quan