0

我正在尝试将 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();
       }
}
4

1 回答 1

1

根据文档

上下文属性可以保存 QVariant 或 QObject* 值。这意味着也可以使用这种方法注入自定义 C++ 对象,并且可以直接在 QML 中修改和读取这些对象。在这里,我们修改上面的例子,嵌入一个 QObject 实例而不是 QDateTime 值,并且 QML 代码调用对象实例上的一个方法:

从上面你可以得出这个类应该继承自 QObject 的结论,另外如果你想调用函数 try 必须在声明中 Q_INVOKABLE 之前,我在下面的代码中展示了这一点:

测试.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

测试.cpp

#include "testing.h"

#include <iostream>
using namespace std;

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

}

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

您还应该在 qml 文件中将from 更改为tryout()to 。trying()

于 2017-07-01T19:35:45.810 回答