2016-10-07 4 views
3

У меня есть болезненная проблема, в которую я потратил много времени. Мне нужна помощь, потому что я уже не знаю.Невозможно создать объект класса C++ в qml «Невозможно назначить объект для списка свойств» «

Вот оно. Я пишу qt быстрое приложение, используя qml в Qt Creator в Windows 8.1. Создал мой собственный класс C++ с именем «один». Зарегистрированных его через:

В QML файл я импортировал:

import OneClass 1.0 

К настоящему времени все работало очень хорошо. Но потом я решил создать общую библиотеку, где я поместил свой «Один» C++-класс. Создан отделенный проект как Новый проект-> Библиотека-> Библиотека C++. Построенная библиотека с именем «mainlib», все было в порядке. Connected эту библиотеку для моего приложения, добавив строки в файл .pro:

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

Выполнить проект, и это момент, когда я получил эту проблему:

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

Кусок моего файла «one.h» :

#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 
} 

Часть моего файла "main.qml", где я объявил мой объект одного класса:

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} 
    ... 
    } 

Кусок моего файла "main.cpp" :

#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(); 
} 

.pro файл моего приложения:

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 

Вот что нужно, если раскомментировать «one.h» и «one.cpp», чтобы скомпилировать их вместе с приложением, эта проблема не появляется, и все работает нормально. Но когда комментируют их для работы с библиотекой, я получаю это: «Невозможно назначить объект для перебора свойства« данных ».

Я попытался подключить библиотеку, щелкнув правой кнопкой мыши по проекту-> Добавить библиотеку, но результат будет таким же. Я прочитал документацию об этом свойстве «данных», попытался явно присвоить объявление объекта «данным», но получил то же самое. Протестировано:

resources: [ 
    One {id: objOne} 
] 

И получил «не может назначить объект для перечисления имущества» ресурсов ». Я просто измучен решением этой проблемы. Я описал вас почти каждый мой шаг, потому что я думаю, что, может быть, я что-то сделал не так? Я прошу о помощи ...

+0

Что такое 'one.h'? –

+0

@Patrizio, я добавил содержание 'one.h' на мое сообщение. –

+0

Можно ли догадаться, что такое «Один» и «ресурс»? – folibis

ответ

1

Возможное решение объявить новое свойство и привязать его к новому компоненту «One»:

Window { 
    property One objOne: One { } 
} 

НО, как вы увидите, это может привести к другие (резьбовые) проблемы. Не делай этого!

I решительно советую использовать встроенный механизм плагина Qt. Он предназначен для того, чтобы делать именно то, что вы хотите: импорт внешних динамических библиотек QML. Проверьте документацию: http://doc.qt.io/qt-5/qtqml-modules-cppplugins.html

+0

Спасибо, будет помнить об этом. Но я просто не могу понять, почему мой вариант не работает? Я думаю, что использование библиотеки аналогично компиляции проекта вместе с классом, ничего не меняется. Существует также документация об общих библиотеках: http://doc.qt.io/qt-4.8/sharedlibrary.html. И даже wiki: https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application. Это не проблема. –

+0

Использование статической библиотеки - это то же самое, что и компиляция вместе с классом. Динамические библиотеки немного разные. Если вам действительно нужна динамическая qml lib, создайте ее, как описано в документе. Это также уменьшит зависимость между обоими проектами. – MrBlueSky

+0

Redone это как плагин. Все работает отлично в режиме выпуска, но в отладке у меня есть ошибка: «плагин не может быть загружен для модуля». Поместите папку debug dir plugin из версии. Но это не сработает. Насколько я понимаю, плагин скомпилирован как обычная библиотека, которую можно использовать в других проектах, даже без qml? Разница только в том, что он подключен как плагин? –

Смежные вопросы