2016-02-12 109 views
12

我對Qt QML中的模塊感到困惑。我已閱讀所有文檔,但沒有說明一些基本的想法。Qt5 QML模塊未安裝

據我所知,我可以把一堆QML文件放到一個目錄中,並添加一個qmldir文件來描述一個已識別的模塊。當我這樣做並調整QML_IMPORT_PATH時,QtCreator很高興,並停止強調導入ModuleName 1.0行。

所以創作者很高興,但它不起作用。我沒有安裝模塊。 我的問題是:

  • 「安裝」是什麼意思。我有文件目錄,但我沒有「安裝」它們在任何地方。
  • 我應該建立/編譯模塊,以使DLL/.so?
  • 模塊QML文件進入主應用程序的資源,否則它們在哪裏被發現?
  • 我的main.qml文件是應用程序資源的一部分,應用程序如何在運行時找到模塊的資源。

對不起,對於所有這些問題,但這些模塊的基礎知識尚不清楚。我不明白,「模塊」只是文件的共享還是編譯單元。

感謝您的任何幫助。

回答

6

我會盡力回答您的問題:

  • 我覺得安裝意味着它們位於正確的路徑,所以
    他們可以在運行時被發現
  • 你不一定爲此創建/構建一個QmlExtrensionPlugin。您也可以在一個 目錄中使用qmldir作爲模塊中的普通QML文件來描述此模塊。這是 分發您的代碼的問題 - 如果您想隱藏代碼,使用QmlExtensionPlugin提供編譯的 模塊。
  • 這些模塊可以在資源系統中或作爲磁盤上的文件,這取決於您。
  • 該應用程序會在預定義的路徑模塊 - 在應用程序的目錄,在QT插件路徑,在QML2_IMPORT_PATH,在目錄中,您添加使用engine->addImportPath()

有一堆東西,可導致模塊未被加載。您可以檢查以下內容:在qmldir

  1. 模塊標識應該是相同的目錄 名,該模塊實際駐留。例如,如果您的模塊 在qmldir中具有模塊標識module TestModule,則您的模塊 目錄名稱必須爲TestModule
  2. 如果是QML擴展 插件(共享庫),請確保插件的目錄名稱爲 與插件名稱相同。
  3. export QML2_IMPORT_PATH(確保名稱中有2)env變量指向包含模塊的目錄。還有一個QQmlEngine::addImportPath方法,它將目錄添加到列表中以查找插件。
  4. 如果它是一個qml擴展插件(共享庫),那麼可能會缺少它的依賴關係。您可以在Windows上使用Dependency Walker或在Linux上使用ldd命令進行檢查。
  5. 設置QT_PLUGIN_PATH運行時變量可能有助於加載插件。它應該指向包含你插件目錄的目錄,而不是插件目錄本身。
  6. 您還可以啓用跟蹤,看看發生了什麼事情,而插件加載更好地理解這一問題 - 出口QT_DEBUG_PLUGINS=1QML_IMPORT_TRACE=1環境變量

您還可以閱讀此鏈接: https://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html

+0

感謝解釋,但我仍然主要是在黑暗中。我發現如果將'addImportPath'設置爲* absolute *路徑,它就可以工作。但我希望引用的QML是本地項目。相對路徑失敗,因爲它們不能從生成的構建目錄中運行。 我也想出瞭如何將模塊+其資源編譯爲DLL。但我不知道如何加載這個DLL。安排它在導入路徑不起作用,因爲我認爲該DLL需要qmldir。該DLL將註冊其中的類型,但這將涉及首先加載它。種雞和雞蛋? –

+1

只需提供DLL插件的qmldir,它大約有3行,將qmldir放在插件旁邊,將其全部放在具有正確名稱的文件夾中,如我在答案中所述,並將該文件夾放在可執行文件的旁邊。這應該工作。你嘗試過嗎? – rightaway717

+0

謝謝。經過漫長的道路和大量搜索,這有助於很多! – Malachi

2

在我的情況(我擁有qrc資源中的所有QML文件)也努力將qmldir添加到資源中,並調用QQmlApplicationEngine的addImportPath(「qrc:/」)方法。

我main.cpp中的樣子:

QQmlApplicationEngine engine; 
engine.addImportPath("qrc:/"); 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

我.pro文件的重要部分看起來像:

RESOURCES += qml.qrc \ 
    MyModule/mymodule.qrc 

QML_IMPORT_PATH += $$PWD 

我qmldir:

module MyModule 

MyItem   2.0 MyItem20.qml 
MyItem   2.1 MyItem21.qml 

我QRC:

<RCC> 
    <qresource prefix="/MyModule"> 
     <file>MyItem20.qml</file> 
     <file>MyItem21.qml</file> 
     <file>qmldir</file> 
    </qresource> 
</RCC> 

最後我main.qml:

import QtQuick 2.5 
import QtQuick.Window 2.2 

import MyModule 2.0 

Window { 
    visible: true 
    width: 640 
    height: 480 

    MyItem { 
     anchors.fill: parent 
    } 
} 

QtCreator是幸福的(不強調成分和進口)和模塊被加載。 希望這有助於。

-1

我有同樣的問題,現在已經修復它。我找到了iOS的QML插件。有跡象表明,需要被照顧的幾件事情:

1.插件親文件需要加法:

URI = IosTestPulgin

# this for error: 
# static plugin for module 「QtQuick」 with name 「IosTestPulgin」 
# has no metadata URI 
QMAKE_MOC_OPTIONS += -Muri=$$uri 

# thanks from:https://github.com/wang-bin/QtAV/issues/368 

2. QML插件qmldir文件需要如下附加行:

classname IosqmlpluginPlugin 
# for ERROR: Plugin iostestqmlplugin is missing a classname entry, 
# please add one to the qmldir file. 
# look for qt document http://doc.qt.io/qt-5.6/qtqml-modules-qmldir.html 

3客戶端項目促文件需要一個除了像這樣:

ios { 
    IOSTestPlugin_BUNDLE.files += $$files($$[QT_INSTALL_QML]/IosTestPulgin/qmldir) 
    IOSTestPlugin_BUNDLE.path = IosTestPulgin 
    QMAKE_BUNDLE_DATA += IOSTestPlugin_BUNDLE 
} 
# for ios error: module is not installed 
# this means external qml static plugin must add the plugin dir by manual 
# in the app root dir