qt — Невозможно создать объект класса C ++ в qml & quot; Невозможно назначить объект для свойства списка & quot; data & quot; & quot;

У меня болезненная проблема, на которую я потратил много времени. Мне нужна помощь, потому что я понятия не имею.

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

qmlRegisterType<One>("OneClass", 1, 0, "One");

В qml файле я его импортировал:

import OneClass 1.0

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

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

Запустите проект, и в этот момент у меня возникнет эта проблема:

QQmlApplicationEngine не удалось загрузить компонент

qrc: /main.qml: 18 Невозможно назначить объект для свойства списка «data»

ASSERT: «! IsEmpty ()» в файле C: \ Program> Files \ Qt \ 5.7 \ mingw53_32 \ include / QtCore / qlist.h, строка 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», где я объявил свой объект класса One:

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» для их компиляции вместе с приложением, эта проблема не появляется и все работает нормально. Но когда комментирую их для работы с библиотекой, я получаю эту проблему «Невозможно назначить объект для свойства списка данных».

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

resources: [
One {id: objOne}
]

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

3

Решение

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

Window {
property One objOne: One { }
}

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector