Встраивание объектов C++ в QML с использованием свойств контекста
Согласно документации Qt5: предоставление методов, включая слоты qt, все открытые слоты классов C++, которые наследуются от QObject, доступны из QML. Вот что я сделал:
C++
class MyClass : public QObject
{
Q_OBJECT
public slots:
void doStuffFromQmlSlot()
{
qDebug() << Q_FUNC_INFO;
}
public:
MyClass()
{
qDebug() << Q_FUNC_INFO;
}
};
мой main.cpp содержит:
MyClass myClass;
QQmlEngine engine;
engine.rootContext()->setContextProperty( "myclass", &myClass );
QQmlComponent component( &engine, QUrl::fromLocalFile("qml/qtquick-01/main.qml") );
component.create();
QML
import QtQuick 2.0
Rectangle {
width: 360
height: 360
Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
myclass.doStuffFromQmlSlot();
Qt.quit();
}
}
}
На самом деле QtCreator, кажется, распознает открытый объект myclass в QML, поскольку он позволяет автоматически завершать как имя класса (myclass), так и открытый слот doStuffFromQmlSlot(). При запуске приложения, к сожалению, я получил следующую ошибку:
ReferenceError: myclass не определен
Любая подсказка о том, что я делаю неправильно?
1 ответ
Я повторно использовал ваш файл qml, чтобы начать новый проект в QtCreator.
Ниже приведены файлы, которые я использовал для успешной компиляции и использования приложения:
файл проекта: test.pro
# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp
# Please do not modify the following two lines. Required for deployment.
include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
qtcAddDeployment()
HEADERS += myclass.h
myclass.h:
#include <QObject>
#include <qdebug.h>
class MyClass : public QObject
{
Q_OBJECT
public slots:
void doStuffFromQmlSlot()
{
qDebug() << Q_FUNC_INFO;
}
public:
MyClass()
{
qDebug() << Q_FUNC_INFO;
}
};
main.cpp:
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
#include "myclass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
MyClass myClass;
QtQuick2ApplicationViewer viewer;
viewer.rootContext()->setContextProperty("myclass", &myClass);
viewer.setMainQmlFile(QStringLiteral("qml/main.qml"));
viewer.showExpanded();
return app.exec();
}
и qml/main.qml - это именно тот фрагмент кода, который указан в вашем вопросе.
если вы запустите проект с использованием QtCreator, у вас также будет готовая к использованию папка qtquick2applicationviewer/. затем qmake && make && ./test
запустит приложение. Если вы нажмете на текстовый элемент, вы получите:
MyClass::MyClass()
void MyClass::doStuffFromQmlSlot()