LINUX.ORG.RU

Экспорт классов из C++ в QML

 , ,


1

5

ЛОР, доброго времени суток.

Вопрос такой. Есть ли возможность пользоваться в QML теми же классами, которые я использую в С++?

Уточню. Я знаю, есть много примеров экспорта типов в QML, так, чтобы ими можно было пользоваться как QML-объектами, но я хочу немного не того.

В примерах обычно даётся такое:

qmlRegisterType<Class>("my.class"...."Class")

import my.class 1.0

Class {
    name: "hello"
    done: true
}

Мне нужно, чтобы этот класс можно было использовать в том числе и в Javascript-вставках QML (как это сейчас с QVariant, например), т.е.

Q_INVOKABLE addItem(ItemClass item);
...
onCheckedChanged: ItemHandler.addItem(new ItemClass())

Как в таком случае нужно вынести класс ItemClass, чтобы QML его внятно понимал и мог инстанцировать в рантайме?

P.S. Я видел макрос QML_DECLARE_TYPE, но так и не нашёл внятного объяснения по его использованию.

★★★

Последнее исправление: Adonai (всего исправлений: 3)

Попробуй QDeclarativeContext и метод setContextProperty. Что-то вроде этого.

    QDeclarativeContext *ctxt = engine->rootContext();
    MyClass* myObject = new MyClass( engine ); //наследник QObject
    ctxt->setContextProperty("myObject_123",myObject);
Blastbit
()
Ответ на: комментарий от Blastbit

Ну, тут инстанцирование не в qml происходит. Это имел ввиду ТС?

aptyp ★★★★
()
Ответ на: комментарий от Blastbit

Нет, так экспортировать один объект я умею уже.

Я имел в виду способ манипуляции с классами. Вот, скажем, как создать в QML в Javascript-функции объект класса, экспортированного из C++-кода? Как его экспортировать так нужно, чтобы это было возможным?

Чувствую, придётся копать исходники QML

Adonai ★★★
() автор топика

Не совсем понял зачем тебе создавать тогда объекты из QML, могу предположить что элементы списка, тогда не лучше ли хранить всё в моделях и вызывать из QML только методы для создания оных? Ну или просто вызывать метод с для добавления, который в свою очередь из с++ уже добавит сам айтем куда надо, хоть с параметрами хоть без.

Как именно такой вариант сделать не знаю, ибо не возникало потребности.

Blastbit
()

There are two ways to create objects dynamically from JavaScript. You can either call Qt.createComponent() to dynamically create a Component object, or use Qt.createQmlObject() to create an object from a string of QML. Creating a component is better if you have an existing component defined in a QML document and you want to dynamically create instances of that component. Otherwise, creating an object from a string of QML is useful when the object QML itself is generated at runtime.

link

Но выше не совсем то. Точно не помню, делал ли такое с плюсовыми классами, но в общем случае что-либо заворачиватеся в Component, после чего создается через createObject. Плюсовый класс так тоже можно, я думаю. Регистрировать таки через qmlRegisterType.

age
()

int main()
{
...
    qmlRegisterType<MyMegaClass>("FieldName", 1, 0, "ClassName");

    QQmlContext *ctx = viewer.engine()->rootContext();
    ctx->setContextProperty("myMegaClass", &myMegaClass);
...
}

.... MyMegaClass.h

class MyMegaClass : public QObject
{
    Q_OBJECT
public:

    Q_INVOKABLE void trololo();
};

Q_DECLARE_METATYPE(MyMegaClass*)

Потом в qml можешь юзать myMegaClass.trololo();

vova7890 ★★★
()
Ответ на: комментарий от Blastbit

Пока что на этом и остановился. В Q_INVOKABLE метод передаю значения, а объект создаётся уже в методе.

@age

Но выше не совсем то. Точно не помню, делал ли такое с плюсовыми классами, но в общем случае что-либо заворачиватеся в Component, после чего создается через createObject. Плюсовый класс так тоже можно, я думаю. Регистрировать таки через qmlRegisterType.

Спасибо, попробую покопать в сторону createObject

@vova7890 Не то, так мы получаем доступ из QML к одному экземпляру класса, а не возможность динамически такие экземпляры создавать

Adonai ★★★
() автор топика

Оно?

Class {
    id: "instance1"
    name: "hello"
    done: true
}

Class {
    id: "instance2"
    name: "hello"
    done: true
}

Class {
    id: "instance3"
    name: "hello"
    done: true
}


// и т д
AF ★★★
()
Последнее исправление: AF (всего исправлений: 1)
Ответ на: комментарий от AF

Нет, не то. Это определение статически, при определении QML-компонента. Можете мне такое динамически создать, в javascript-функции?

Adonai ★★★
() автор топика
Ответ на: комментарий от AF

Попробую на днях.

P.S. надеялся до самого конца, что есть проще метод

Спасибо!

Adonai ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.