我正在尝试将C ++类连接到QML,但是我遇到了问题,编译时会出现以下错误。
我正在添加图片以显示错误:
我正在使用一个简单的类来测试我的代码是否有效,这是代码 testing.h:
#ifndef TESTING_H
#define TESTING_H
class 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 :(得分:1)
上下文属性可以包含QVariant或QObject *值。这个 意味着也可以使用这种方法注入自定义C ++对象,并且 可以在QML中直接修改和读取这些对象。在这里,我们 修改上面的例子来嵌入一个QObject实例而不是一个 QDateTime值,QML代码调用对象上的方法 实例:
从上面你可以得出结论,该类应该继承自QObject,另外如果你想调用函数试试你必须在声明中的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;
}
您还应该在qml文件中从tryout()
更改为trying()
。