Qt调用具有自定义QObject类型的qml函数

Qt invoking qml function with custom QObject type

本文关键字:类型 qml 函数 QObject 自定义 调用 Qt      更新时间:2023-10-16

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

这是我的自定义类型(*注意,我发布的所有代码并不完全是我正在使用的,我已经提取了相关部分,所以如果你试图编译,可能需要进行一些更改)

自定义.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)

自定义.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属性?

由于您似乎已经正确注册了所有内容,您可能会遇到QML中有时会发生的错误,对象似乎卡在QVariant包装中。试试下面的方法,看看是否有效。

import com.mycustom 1.0
property QtObject temp
function(custom) {
    temp = custom;
    console.log(temp.ssid);
}

有时,强制实例为QtObject会删除烦人的"QVariant包装器"并解决问题。