Qt使用自定义QObject类型调用qml函数

时间:2014-04-24 14:02:26

标签: c++ qml qt5 qtquick2

我想从c ++调用qml方法作为自定义类型的参数传递。

这是我的自定义类型(*请注意,我发布的所有代码都不是我正在使用的代码,我已经提取了相关部分,因此如果您尝试编译它可能需要进行一些更改)

Custom.h

class Custom : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString ssid READ getSSID WRITE setSSID)

public:

Q_INVOKABLE const QString& getSSID() {
        return m_ssid;
    }
     Q_INVOKABLE void setSSID(const QString& ssid) {
        m_ssid = ssid;
    }
}

private:
    QString m_ssid;
};
Q_DECLARE_METATYPE(NetworkInfo)

Custom.cpp

Custom::Custom(): QObject() {
    setSSID("ABC");
}


Custom::Custom(const Custom & other): QObject() {
    setSSID(other.getSSID());
}

这就是我调用qml方法的地方

void MyClass::myMethod(const Custom &custom) {
      QMetaObject::invokeMethod(&m_item,
                              "qmlMethod", Q_ARG(QVariant, QVariant::fromValue(custom)));
}

其中QQuickItem& m_item

我已将Custom声明为QML和QT元类型

qmlRegisterType<Custom>("com.mycustom", 1, 0, "Custom");

当我尝试访问qml

中的参数时
import com.mycustom 1.0

function(custom) {
    console.log(custom.ssid)
}

我得到了

qml: undefined

如果我console.log(custom)

qml: QVariant(Custom)

所以,我会说我的类型被正确导入到Qt中(我已经使用它而没有问题直接在Qml中实例化

Custom {
 ....
}

现在,问题是:)

为什么我无法访问ssid属性?

1 个答案:

答案 0 :(得分:3)

由于您似乎已经正确地注册了所有内容,因此您可能正在编造一个有时会出现QML的错误,其中对象似乎卡在QVariant包装中。请尝试以下操作,看看它是否有效。

import com.mycustom 1.0

property QtObject temp

function(custom) {
    temp = custom;
    console.log(temp.ssid);
}

有时强制你的实例成为QtObject会删除恼人的“QVariant包装器”并解决问题。