2016-02-12 25 views
12

Jestem zdezorientowany modułami Qt QML. Czytałem wszystkie dokumenty, ale nie wyjaśnia to kilku podstawowych idei.Moduł Qt5 QML nie jest zainstalowany

Rozumiem, że mogę umieścić kilka plików QML w katalogu i dodać plik qmldir do opisania zidentyfikowanego modułu. Kiedy to robię i dostosowuję QML_IMPORT_PATH, QtCreator jest szczęśliwy i przestaje podkreślać linię importu ModuleName 1.0.

Twórca jest zadowolony, ale nie działa. Otrzymuję moduł nie jest zainstalowany. Moje pytania to:

  • co to znaczy "zainstalowany". Mam katalog plików, ale nie "zainstalowałem" ich nigdzie.
  • Czy powinienem budować/kompilować moduł, aby utworzyć bibliotekę DLL/.so?
  • czy moduły plików QML trafiają do zasobów głównej aplikacji, w przeciwnym razie, gdzie można je znaleźć?
  • mój plik main.qml jest częścią zasobów aplikacji, w jaki sposób aplikacja lokalizuje zasoby modułu w środowisku wykonawczym.

Przepraszamy za wszystkie te pytania, ale podstawy tych modułów są po prostu niejasne. Nie rozumiem, czy "moduł" to tylko udostępnianie plików lub jest to skompilowana jednostka.

dzięki za pomoc.

Odpowiedz

6

Postaram się odpowiedzieć na Twoje pytania:

  • myślę zainstalowany oznacza, że ​​znajdują się w odpowiednich ścieżkach, więc
    że można je znaleźć w czasie wykonywania
  • Nie powinieneś koniecznie utwórz/zbuduj QmlExtrensionPlugin w tym celu. Możesz także użyć jako zwykłych plików QML modułu w jednym katalogu z qmldir opisującym ten moduł. To kwestia dystrybucji kodu przez - za pomocą QmlExtensionPlugin dostarczasz skompilowany moduł , jeśli chcesz ukryć kod.
  • Moduły mogą znajdować się w systemie zasobów lub jako pliki na dysku, to zależy od Ciebie.
  • Aplikacja wyszukuje modułów zdefiniowanych ścieżek - w katalogu Twojej aplikacji, w QT plugins ścieżce, w QML2_IMPORT_PATH, w katalogach, które zostały dodane przy użyciu engine->addImportPath()

Istnieje kilka rzeczy, które mogą prowadzić do modułu nie jest załadowany. Można sprawdzić następujące elementy:

  1. identyfikator w qmldir modułu powinna być taka sama jak nazwa katalogu , gdzie moduł faktycznie zamieszkuje. Na przykład, jeśli Twój moduł ma identyfikator modułu module TestModule w qmldir, nazwa twojego katalogu modułów musi być TestModule.
  2. Jeśli jest to rozszerzenie wtyczki QML (biblioteka współdzielona), upewnij się, że nazwa katalogu wtyczki to tak samo jak nazwa wtyczki.
  3. eksportuj QML2_IMPORT_PATH (upewnij się, że w nazwie jest 2) zmienna, która wskaże katalog zawierający Twój moduł.Istnieje również metoda QQmlEngine::addImportPath, która dodaje katalog do listy w poszukiwaniu wtyczek.
  4. Jeśli jest to wtyczka rozszerzenia qml (biblioteka współdzielona), być może brakuje w nim zależności. Możesz to sprawdzić przez Dependency Walker w systemie Windows lub polecenie ldd w systemie Linux.
  5. Ustawienie zmiennej wykonawczej QT_PLUGIN_PATH może pomóc załadować wtyczki. Powinien wskazywać na katalog zawierający katalog wtyczki, a nie sam katalog wtyczki.
  6. Można także włączyć ślady, aby zobaczyć, co się dzieje podczas wtyczki są ładowane do lepszego zrozumienia problemu - eksport QT_DEBUG_PLUGINS=1 i QML_IMPORT_TRACE=1 środowisku zmiennych

Można również przeczytać ten link: https://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html

+0

Dzięki za wyjaśnienia, ale jestem nadal głównie w ciemności. Zorientowałem się, że jeśli ustawię 'addImportPath' na ścieżkę * absolute *, to działa. Ale chcę, aby wspomniany QML był lokalny dla projektu. względne ścieżki kończą się niepowodzeniem, ponieważ nie działają z powstałego katalogu kompilacji. Zrozumiałem również, jak skompilować moduł + jego zasoby do biblioteki DLL. Ale nie mam pojęcia, jak załadować tę bibliotekę DLL.umieszczenie go w ścieżce importu nie działa, ponieważ, myślę, że DLL potrzebuje qmldir. Biblioteka DLL zarejestruje typy w niej, ale będzie to wymagało najpierw załadowania. rodzaj kurczaka i jajka? –

+1

Wystarczy podać qmldir dla wtyczki DLL, ma ona około 3 wiersze, umieścić qmldir obok wtyczki, umieścić wszystko w folderze o odpowiedniej nazwie, jak stwierdziłem w odpowiedzi, i umieścić folder obok pliku wykonywalnego . To powinno działać. Czy próbowałeś tego? – rightaway717

+0

Dziękuję. Po długiej drodze i wielu poszukiwaniach to bardzo pomaga! – Malachi

2

W mój przypadek (mam wszystkie pliki QML w zasobach qrc) pracował, aby dodać qmldir do zasobów również i wywoływać metodę addImportPath ("qrc: /") QQmlApplicationEngine.

Moja main.cpp wygląda następująco:

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

Ważne części mojego .pro pliku wygląda następująco:

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

QML_IMPORT_PATH += $$PWD 

Moja qmldir:

module MyModule 

MyItem   2.0 MyItem20.qml 
MyItem   2.1 MyItem21.qml 

Moja QRC:

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

I wreszcie moja 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 
    } 
} 

Qt Creator jest zadowolony (nie podkreślając komponenty i import) oraz moduł jest załadowany. Mam nadzieję, że to pomoże.

-1

Miałem ten sam problem i teraz go naprawiłem. Znalazłem wtyczkę QML dla iOS. Istnieje kilka rzeczy, które muszą być pod opieką:

1. Wtyczka plików pro potrzebuje dodatek:

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. Plik qmldir wtyczki QML wymaga dodatkowej linii:

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 Projekt klient pro plik potrzebuje dodatek takiego:

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 
Powiązane problemy