2016-03-29 9 views
-1

ich folgende main.qml Datei habe:Externe Binärressource geöffnet, aber nicht vorhanden in QML

import QtQuick 2.5 
import QtQuick.Controls 1.4 

Item 
{ 
    anchors.centerIn: parent 

    Label 
    { 
     id: textLabel 
     anchors.fill: parent 
     x: 200 
     y: 400 
    } 

    CustomObject 
    { 
     id: customObjectId 
    } 
} 

CustomObject ist eine QML Datei in einer externen binären Ressource definiert, erzeugt durch den rcc Befehl:

rcc -binary -o redTheme.qrc redTheme.rcc 

CustomObject.qml

import QtQuick 2.5 
import QtQuick.Controls 1.4 

Item 
{ 
    Rectangle 
    { 
     width: 200 
     height: 120 
     color: "blue" 
     Label 
     { 
      text: "customObject" 
     } 
    } 
} 

Im C++ Seite, melde ich meine Ressource wie folgt aus:

QResource::registerResource(QCoreApplication::applicationDirPath() + "/data/themes/redTheme.rcc"); 

Die Funktion true zurückgibt, was bedeutet, dass die Datei geöffnet wird.

Noch existiert CustomObject nicht in meiner main.qml Datei. Warum?

CustomObject is not a type

EDIT: ich CustomObject in eine QML Module gewickelt habe und es dann in eine .rcc Datei kompiliert (es bedeutet, dass die qmldir Datei im .qrc ist). Kein Unterschied, CustomObject wird immer noch nicht als ein Typ erkannt, auch wenn ich eine import Anweisung (import redTheme 1.0) hinzufügen. Inhalt meiner qmldir Datei:

module redTheme 
CustomObject 1.0 CustomObject.qml 
+0

Mögliche Duplikat [Dynamisch QML Thema zur Laufzeit ändern] (http://stackoverflow.com/questions/36335481/dynamically-change-qml-theme-at-runtime) –

Antwort

1

mir nicht 100% sicher bin, aber ich denke, QML-Dateien als nur Typen für „interne“ QML-Dateien arbeiten, dh die QML-Dateien, die in der internen Ressourcendatei sind .

Damit externe QML-Dateien als Typen arbeiten können, muss ein gültiges QML-Modul mit seiner qmldir Datei und so definiert sein. Es kann auch möglich sein, es als einen Typ unter Verwendung der C++ - API verfügbar zu machen, aber ich habe es nicht untersucht, im Grunde ist es das, was der qmldir Dateiparser tut.

Die andere Möglichkeit, externe QML-Dateien zu verwenden, ist als Pfad/URL, dh wenn Sie es instanziieren möchten, müssen Sie entweder Loader verwenden oder es manuell instanziieren.

Dies könnte helfen externe QML-Dateien als QML-Typen registrieren:

int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)

Diese Funktion einen Typ mit dem Namen qmlName, aus uri importiert in der Bibliothek in der QML-System registriert die mit Versionsnummer komponiert von VersionMajor und VersionMinor. Der Typ wird definiert durch die QML-Datei an der URL. Die URL muss eine absolute URL sein, d. H. url.isRelative() == false.

Normalerweise können QML-Dateien als Typen direkt aus anderen QML-Dateien geladen werden oder eine qmldir-Datei verwenden.Diese Funktion ermöglicht die Registrierung von Dateien zu Typen aus C++ - Code, z. B. wenn die Typzuordnung beim Start prozedural festgelegt werden muss.

+0

ich viele Themen erstellen möchten Das wird nach dem Willen des Benutzers umschaltbar sein (Beispiel: Der Benutzer klickt auf eine Schaltfläche, die zwischen dem blauen und dem roten Thema wechselt.) Daher glaube ich nicht, 'qmlRegisterType' zu ​​verwenden, da ich am Ende sein werde mit Dutzenden/Hunderten von zusätzlichen Codezeilen. Ich könnte mein 'CustomObject' in ein' QML Module' integrieren, aber es ist bereits in einer '.qrc' Datei. Ist das nicht ein bisschen überflüssig? –

+0

Nun, entweder möchten Sie eine QML-Datei als Typr verwenden oder Sie nicht, was ist das? In Ihrem Code ist dies das, was Sie versuchen, und die Registrierung eines Typs ist die einzige Möglichkeit, dies entweder manuell oder mit einer 'qmldir'-Datei zu tun. Wie auch immer, es hängt wirklich davon ab, was Sie unter Themen verstehen - nur unterschiedliche Dimensionen und Farben oder eine komplett andere UI-Struktur? – dtech

+0

Momentan sind es nur Abmessungen und Farben. Ich werde versuchen, mit QML-Modul-Lösung und halten Sie auf dem Laufenden. –