【问题标题】:Qt invoking qml function with custom QObject typeQt 使用自定义 QObject 类型调用 qml 函数
【发布时间】:2014-04-24 14:02:25
【问题描述】:

我想从 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 属性?

【问题讨论】:

    标签: c++ qml qt5 qtquick2


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多