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属性的信号