2016-10-07 1 views
3

Ich habe ein schmerzhaftes Problem, für das ich eine Menge Zeit verschwendet habe. Ich brauche Hilfe, weil ich noch keine Ahnung habe.Kann C++ - Klassenobjekt in qm nicht erstellen "Kann Objekt nicht zur Listeneigenschaft" data ""

Hier ist es. Ich schreibe qt schnelle Anwendung mit Qml in Qt Creator auf Windows 8.1. Meine eigene C++ Klasse mit dem Namen "one" erstellt. Registriert es über:

In qml Datei ich es importiert:

import OneClass 1.0 

Inzwischen alles sehr gut funktioniert. Aber dann habe ich beschlossen, eine Shared Library zu erstellen, wo ich meine "One" C++ Klasse einbaute. Separates Projekt als neues Projekt-> Bibliothek-> C++ - Bibliothek erstellt. Erbaute Bibliothek mit dem Namen "Mainlib", alles war in Ordnung. Verbunden diese Bibliothek zu meiner Anwendung von Zeichenketten in .pro-Datei hinzufügen:

DEPENDPATH += ../lib/mainlib 
INCLUDEPATH += ../lib/mainlib 
LIBS += -L../lib/build-mainlib-Desktop_Qt_5_7_0_MinGW_32bit-Release/release -lmainlib 

Run-Projekt und das ist Moment, wenn ich dieses Problem habe:

QQmlApplicationEngine failed to load component

qrc:/main.qml:18 Cannot assign object to list property "data"

ASSERT: "!isEmpty()" in file C:\Program >Files\Qt\5.7\mingw53_32\include/QtCore/qlist.h, line 341

Stück meiner „one.h“ Datei :

#ifndef ONE_H 
#define ONE_H 

#include "mainlib_global.h" 
#include <QObject> 

class MAINLIBSHARED_EXPORT One : public QObject 
{ 
    Q_OBJECT 

    Q_PROPERTY(QString port_number READ get_port_number WRITE set_port_number) 
    Q_PROPERTY(QString port_speed READ get_port_speed WRITE set_port_speed) 
    Q_PROPERTY(QString x READ get_x WRITE set_x) 
    Q_PROPERTY(QString y READ get_y WRITE set_y) 

public: 
    One(); 
    ~One(); 

    QString get_port_number(void); 
    ... 

signals: 
    void portOpened(QString str); 
    ... 

private: 
    QString port_number; 
    QString x; 
    QString y; 
}; 

#endif // ONE_H 

"mainlib_global.h":

#ifndef MAINLIB_GLOBAL_H 
#define MAINLIB_GLOBAL_H 

#include <QtCore/qglobal.h> 

#if defined(MAINLIB_LIBRARY) 
# define MAINLIBSHARED_EXPORT Q_DECL_EXPORT 
#else 
# define MAINLIBSHARED_EXPORT Q_DECL_IMPORT 
#endif 

#endif // MAINLIB_GLOBAL_H 

"mainlib.pro":

QT  -= gui 

TARGET = mainlib 
TEMPLATE = lib 

DEFINES += MAINLIB_LIBRARY 

SOURCES += one.cpp 

HEADERS += one.h\ 
     mainlib_global.h 

unix { 
    target.path = /usr/lib 
    INSTALLS += target 
} 

Stück meiner "main.qml" Datei, wo ich meine Aufgabe einer Klasse deklariert:

import QtQuick 2.5 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 
import QtQuick.Controls.Styles 1.0 
import OneClass 1.0 
import QtQuick.Dialogs 1.1 

Window { 
    id: mainWindow 
    visible: true 
    width: 1000 
    height: 720 
    minimumWidth: 930 
    color: "lightgrey"; 
    property bool connected: false 

    // Object declaration 
    One {id: objOne} 
    ... 
    } 

Stück meiner "main.cpp" Datei :

#include <QGuiApplication> 
#include <QQmlApplicationEngine> 
#include <QtSerialPort/QSerialPortInfo> 
#include <QDebug> 
#include "one.h" 

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 

    QLocale::setDefault(QLocale::c()); 
    qmlRegisterType<One>("OneClass", 1, 0, "One"); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
    ... 
    return app.exec(); 
} 

.proDatei My Anwendung:

TEMPLATE = app 

DEPENDPATH += ../lib/mainlib 
INCLUDEPATH += ../lib/mainlib 
LIBS += -L../lib/build-mainlib-Desktop_Qt_5_7_0_MinGW_32bit-Release/release -lmainlib 

QT += qml quick serialport 
CONFIG += c++11 

win32: RC_ICONS += icon.ico 

SOURCES += main.cpp \ 
    #one.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) 

HEADERS += \ 
    #one.h 

Hier ist die Sache, wenn "one.h" und "one.cpp" auskommentieren, um sie neben der Anwendung zu kompilieren, erscheint dieses Problem nicht und alles funktioniert gut. Aber wenn sie kommentiert werden, um mit der Bibliothek zu arbeiten, bekomme ich dieses Problem "Kann Objekt nicht zu Liste Eigenschaft" Daten "" Problem zuweisen.

Ich habe versucht, Bibliothek über Rechtsklick auf Projekt-> Bibliothek hinzufügen verbinden, aber das Ergebnis ist das gleiche. Ich habe die Dokumentation über diese "Daten" -Eigenschaft gelesen, versucht, die Objektdeklaration explizit den "Daten" zuzuordnen, aber ich habe die gleiche erhalten. Erprobt:

resources: [ 
    One {id: objOne} 
] 

Und bekam "kann Objekt nicht zu listen Eigenschaft" Ressourcen "". Ich bin nur erschöpft mit der Lösung dieses Problems. Ich habe dich fast jeden Schritt beschrieben, weil ich denke, dass ich etwas falsch mache? Ich bitte um Hilfe ...

+0

Was ist der Inhalt von 'one.h'? –

+0

@Patrizio, ich habe den Inhalt von 'one.h' zu meinem Beitrag hinzugefügt. –

+0

Sollen wir raten, was eins ist und was 'Ressource' betrifft? – folibis

Antwort

1

Eine mögliche Lösung eine neue Eigenschaft zu erklären ist und binden sie an eine neue ‚One‘ Komponente:

Window { 
    property One objOne: One { } 
} 

ABER wie Sie dies sehen kann dazu führen, andere (threading) Probleme. Tu es nicht!

I stark raten Ihnen, den Qt eingebauten Plugin-Mechanismus zu verwenden. Es wurde entwickelt, um genau das zu erreichen, was Sie wollen: externe dynamische QML-Bibliotheken importieren. Überprüfen Sie die Dokumentation: http://doc.qt.io/qt-5/qtqml-modules-cppplugins.html

+0

Danke, werde es im Hinterkopf behalten. Aber ich kann einfach nicht verstehen, warum meine Variante nicht funktioniert? Ich denke, mit der Bibliothek ist das gleiche wie das Kompilieren Projekt neben der Klasse, ändert sich nichts. Es gibt auch Dokumentation über gemeinsame Bibliotheken: http://doc.qt.io/qt-4.8/sharedlibrary.html. Und sogar Wiki: https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application. Sollte kein Problem sein. –

+0

Die Verwendung einer statischen Bibliothek entspricht der Kompilierung neben der Klasse. Dynamische Bibliotheken sind ein bisschen anders. Wenn Sie wirklich eine dynamische qml lib benötigen, erstellen Sie sie wie im Dokument beschrieben. Dies verringert auch die Abhängigkeit zwischen beiden Projekten. – MrBlueSky

+0

Redone es als Plugin. Im Release-Modus funktioniert alles einwandfrei, aber im Debug habe ich einen Fehler: 'Plugin kann nicht für Modul geladen werden'. Setze den debug dir plugin Ordner von release. Aber es funktioniert nicht. Wie ich verstehe Plugin ist als normale Bibliothek kompiliert, das kann in anderen Projekten verwendet werden, auch nicht qml? Der einzige Unterschied ist, dass es als Plugin verbunden ist? –

Verwandte Themen