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

Posted

技术标签:

【中文标题】Qt 使用自定义 QObject 类型调用 qml 函数【英文标题】:Qt invoking qml function with custom QObject type 【发布时间】: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 属性?

【问题讨论】:

【参考方案1】:

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

import com.mycustom 1.0

property QtObject temp

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

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

【讨论】:

以上是关于Qt 使用自定义 QObject 类型调用 qml 函数的主要内容,如果未能解决你的问题,请参考以下文章

Qt Qml连接到Context属性的QObject属性的信号

QML:获取 QObject 父级

如果自定义类型从 C++ 作为 const 传递,如何使用 QML 注册自定义类型

QML/QT 如何将对象从 C++ 转换为 QML?

任何使用 QML 的非 QObject 类的机会

使用 Qt.createQmlObject() 创建自定义 qml 对象实例