Как регистрировать С++ классы для QML? module “” version 0.1 is not installed

146
11 января 2020, 07:50

Я делаю по уроку . Но у меня ошибка :qrc:/Samples/Analysis/ViewshedGeoElement/ViewshedGeoElement.qml:29:1: module "MapDataSenderTexture" version 0.1 is not installed Мой код:

mapdatasendertexture.h

#ifndef MAPDATASENDERTEXTURE_H
#define MAPDATASENDERTEXTURE_H
#include <QObject>
//#include "threedmodeltexture.h"
class MapDataSenderTexture: public QObject
{
    Q_OBJECT
    Q_PROPERTY(int someProperty READ getSomeProperty WRITE setSomeProperty NOTIFY mapChanged)
public:
    explicit MapDataSenderTexture(QObject *parent = nullptr);
    int getSomeProperty()const;
    void setSomeProperty(const int &);
signals:
    void mapChanged(const int &);
private:
    int someProperty;
};
#endif // MAPDATASENDERTEXTURE_H

mapdatasendertexture.cpp

#include "mapdatasendertexture.h"
MapDataSenderTexture::MapDataSenderTexture(QObject *parent)
{
}
int MapDataSenderTexture::getSomeProperty()const
{
//    qDebug() << "I'm getter";
    return someProperty;
}
void MapDataSenderTexture::setSomeProperty(const int &i)
{
//    qDebug() << "I'm setter";
    someProperty = i;
}

main.cpp

...
    qmlRegisterType<MapDataSenderTexture>("MapDataSenderTexture", 1, 0, "MapDST");
...

ViewshedGeoElement.qml

...
import MapDataSenderTexture 0.1
...
...
    MapDST {
        onMapChanged:
        {
...
        }
    }
...
Answer 1

Это неверно по смыслу:

qmlRegisterType<MapDataSenderTexture>("MapDataSenderTexture", 1, 0, "MapDST");

Первый параметр это путь к виртуальному пакету (выберите любой).

Например так:

qmlRegisterType<MapDataSenderTexture>("my.widgets", 1, 0, "MapDST");

Применение в qml:

import my.widgets 1.0
//...
    MapDST {
    }
//...
Answer 2

Иногда, вместо регистрации модуля, я пробрасываю глобальную переменную непосредственно в QML

main.cpp

#include <QtWidgets/QApplication>
#include <QtQuick/QQuickView>
#include <QtQml/QQmlEngine>
#include <QtQml/QQmlContext>
#include "backend.h"
int main(int argc, char *argv[])
{
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QQuickView viewer;
    viewer.setResizeMode(QQuickView::SizeRootObjectToView);
    BackEnd backend;
    viewer.rootContext()->setContextProperty("backEnd", &backend);
    QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
    viewer.setSource(QUrl("qrc:/main.qml"));
    viewer.show();
    return app.exec();
}

backend.h

#ifndef BACKEND_H
#define BACKEND_H
#include <QObject>
class BackEnd : public QObject
{
    Q_OBJECT
public:
BackEnd();
signals:
public slots:
QString getContacts();
};
#endif // BACKEND_H

main.qml

import QtQuick 2.7
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0
import QtQuick.XmlListModel 2.0
ColumnLayout{
    function lol(){
    xmlModel.xml=backEnd.getContacts();
    }

Это позволяет не разбираться со странной системой модулей QML и использовать сущности из C++ повторно, не плодя лишний код

READ ALSO
С++ заполнение поля класса в компил-тайме

С++ заполнение поля класса в компил-тайме

Хотелось бы получить возможность заполнять байтовое поле в классе гарантировано в компил-тайме используя человекочитаемые enum'ы и структурыНапример:

134
Не могу подключить libpng к проекту в VS Community 2017

Не могу подключить libpng к проекту в VS Community 2017

Никак не могу найти, как правильно установить libpng для VS community 2017Не смог установить при помощи видео с установкой для VS 2015, так как не совпадают...

94
Как QMap передать в qml и вывести в ComboBox?

Как QMap передать в qml и вывести в ComboBox?

Не понимаю как QMap <int, ThreeDModelTexture*> mapTexture; передать в qmlКласс ThreeDModelTexture у меня такой :

146
Использование стороннего компилятора clang на macOS для Qt qmake

Использование стороннего компилятора clang на macOS для Qt qmake

Мне надо собрать проект C++ QtУ меня установлен llvm-8, в pro-файле указанно

110