【问题标题】:QML is not recognising C++ functionsQML 无法识别 C++ 函数
【发布时间】:2015-08-16 03:01:44
【问题描述】:

我正在尝试将我的 c++ 类实现到 QML 中,通过设置 context 属性来识别该类,我可以成功调用该类并查看所有函数,但在运行时它们无法识别并返回错误: TypeError: 对象 Wrapper(0x7b211cbf10) 的属性 'getSrcImage' 不是函数,我认为这些函数没有正确声明到 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
}

【问题讨论】:

  • 您是否尝试过不将这些功能设为私有?

标签: c++ qml integration


【解决方案1】:

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

尝试将它们切换为公共重试。

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_OBJECT 宏下方声明它们的其他示例..
  • 如果它不起作用,您应该先尝试初始化 Wrapper Wrapper* wrap = new Wrapper(); 然后将其放入上下文中:engine.rootContext()-&gt;setContextProperty("wrapper", wrap);
  • 请注意,您的函数名称大小写不尊重任何内容,QML 区分大小写
  • 在我的情况下,错误是由于方法是 private 而不是 public
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多