Qt调用具有自定义QObject类型的qml函数
Qt invoking qml function with custom QObject type
我想从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包装器"并解决问题。
相关文章:
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 如何将不同的变量传递给相同类型的 QML
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 如何使用 c++ 模型填充播放列表 qml 类型
- QML自定义列表数据类型
- 如何使用QMLRegisterType在QML中指定C 类型
- 如何将c 返回值列表或其他复杂类型的QML列表
- 运行 QML 时出现"未知方法参数类型"错误
- 将QML数组和MAP/对象类型与C 区分开
- 如何制作自定义C 类QML类型
- 了解向 QML 公开C++类型的属性
- 使用更新功能扩展QML图像类型
- QML/real和C++/float之间的Qt类型错误
- 将抽象类型公开为QML的Q_PROPERTY
- 枚举类型作为QML的C++类中的属性类型
- 访问/修改Qt/QML中某个类型的所有实例
- C++ 注册类型上的信号 QML 插槽
- QML 无法将分配shared_ptr分配给<Track> [未知属性类型]
- QT 哪些 QML/C++ 数据类型可以转换为 JSON