Внедрение объектов C ++ в QML с помощью свойств контекста

5

Согласно документации 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;
    }
};

my 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 не определен

Любая подсказка о том, что я делаю неправильно?

    
задан sergico 08.03.2014 в 17:09
источник

1 ответ

5

Я повторно использовал ваш 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()
    
ответ дан Sylvain Pineau 08.03.2014 в 20:25
источник