QML不能识别c++函数

QML is not recognising C++ functions

本文关键字:函数 c++ 识别 不能 QML      更新时间:2023-10-16

我试图将我的c++类实现为QML,类是通过设置上下文属性来识别的,我可以成功调用类并查看所有函数,但在运行时它们不被识别并返回错误:类型错误:对象包装器的属性'getSrcImage' (0x7b211cbf10)不是一个函数,我相信函数没有正确地声明到QML,但不知道如何修复。

. h文件
class Wrapper : public QObject
{
    Q_OBJECT
    Q_INVOKABLE void initiateLipLib();
    Q_INVOKABLE bool setMat();
    Q_INVOKABLE QImage displayfeed();
    Q_INVOKABLE void getMatFeed();
    Q_INVOKABLE int liptrainstart(cv::Mat Image);
    Q_INVOKABLE void liptrainingend();
    Q_INVOKABLE float getDistance();
    Q_INVOKABLE std::string getstatus();
    Q_INVOKABLE void clear();
public:
    explicit Wrapper(QObject *parent = 0);
    QString getSrcImage();

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QtQml/QQmlContext>
#include <QDebug>
#include "wrapper.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("wrapper", new Wrapper);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

.qml

Image {
            id: camfeed
            visible: false
            source: wrapper.getstatus()
            anchors.centerIn: camcontainer
}

您的Q_INVOKABLE函数需要在包装器对象中为public,并且我希望您知道,如果不设置为public,它们是private

尝试将它们切换为public,然后重试。

class Wrapper : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE void initiateLipLib();
    Q_INVOKABLE bool setMat();
    Q_INVOKABLE QImage displayfeed();
    Q_INVOKABLE void getMatFeed();
    Q_INVOKABLE int liptrainstart(cv::Mat Image);
    Q_INVOKABLE void liptrainingend();
    Q_INVOKABLE float getDistance();
    Q_INVOKABLE std::string getstatus();
    Q_INVOKABLE void clear();
    explicit Wrapper(QObject *parent = 0);
    QString getSrcImage();

解决方案是将Q_INVOKABLE更改为Q_PROPERTY,在公共中定义函数,然后在我的qml中调用它们。所有的函数似乎工作正常,并返回正确的值。