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

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

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

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

#ifndef TESTING_H
#define TESTING_Hclass Testing
{
public:
Testing();
void trying();
};

#endif // TESTING_H

и testing.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();
}
}

0

Решение

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

Свойства контекста могут содержать значения 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]