Ошибка установки контекста QML

Я пытаюсь подключить класс C++ к QML, но столкнулся с проблемой: при компиляции появляются следующие ошибки.

Я добавляю изображение, чтобы показать ошибки:

Я использую простой класс, чтобы проверить, работает ли мой код, вот код testing.h:

#ifndef TESTING_H
#define TESTING_H


class Testing
{
public:
    Testing();
    void trying();
};

#endif // TESTING_H

и тестирование.cpp:

#include "testing.h"
#include <iostream>
using namespace std;

Testing::Testing()
{

}
void Testing::trying()
{
    cout<<"hello"<<endl;
}

и main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "testing.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlContext* context= engine.rootContext();
    Testing a;
    context->setContextProperty("test",&a);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

и main.qml:

import QtQuick 2.5
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    MouseArea{
        anchors.fill: parent
        onClicked: test.tryout();
       }
}

person Abibad Abdou    schedule 01.07.2017    source источник
comment
что такое проба?   -  person eyllanesc    schedule 01.07.2017
comment
метод текстовых сообщений, извините, я не упомянул   -  person Abibad Abdou    schedule 01.07.2017
comment
посмотри мой ответ пожалуйста   -  person eyllanesc    schedule 01.07.2017
comment
попытка == проба?   -  person eyllanesc    schedule 01.07.2017


Ответы (1)


Согласно документации:

Свойства контекста могут содержать значения QVariant или QObject*. Это означает, что пользовательские объекты C++ также могут быть внедрены с использованием этого подхода, и эти объекты могут быть изменены и прочитаны непосредственно в QML. Здесь мы модифицируем приведенный выше пример, чтобы внедрить экземпляр QObject вместо значения QDateTime, а код QML вызывает метод для экземпляра объекта:

Из вышесказанного можно сделать вывод, что класс должен наследоваться от QObject, кроме того, если вы хотите вызвать функцию try, вы должны указать в объявлении перед Q_INVOKABLE, это показано в следующем коде:

testing.h

#ifndef TESTING_H
#define TESTING_H

#include <QObject>

class Testing: public QObject
{
    Q_OBJECT
public:
    Testing(QObject *parent=0);
    Q_INVOKABLE void trying();
};

#endif // TESTING_H

testing.cpp

#include "testing.h"

#include <iostream>
using namespace std;

Testing::Testing(QObject *parent):QObject(parent)
{

}

void Testing::trying()
{
    cout<<"test"<<endl;
}

Вы также должны изменить tryout() на trying() в файле qml.

person eyllanesc    schedule 01.07.2017