几种QQuickWidget与Qml交互数据的方法

QQuickWidget底层继承的是QWidget,但它可以加载Qml文件(组件),但我们有时候需要和Qml文件(组件)数据交互使用,本文介绍几种QQuickWidget与Qml交互数据的方法。

通过设置上下文属性

setContextProperty可以将变量设置到Qml环境中。

C++代码:

javascript 复制代码
QQuickWidget *view = new QQuickWidget;
QString str = "Hello world";
/* 设置变量到Qml中 */
view->rootContext()->setContextProperty("str", str);
view->setSource(QUrl("qrc:/View.qml"));
view->show();

Qml代码:

javascript 复制代码
import QtQuick 2.0
Rectangle {
    width: 640; height: 320
 
    Text {
        anchors.centerIn: parent;
        text: str  /* 引用C++传入的str变量。*/
    }
}

2.通过注册Qml类型方式

  使用qmlRegisterType注册一个QObject派生类到Qml中。

C++代码:

javascript 复制代码
导入MyObject类到Qml中 */
qmlRegisterType<MyObject>("MyModel", 1, 0, "MyObject");
 
QQuickWidget *view = new QQuickWidget;
view->setSource(QUrl("qrc:/View.qml"));
view->show();

/*

「注意:导入的类型必须实例化才能使用」。

Qml代码:

javascript 复制代码
import QtQuick 2.0
/* 导入MyModel模块 */
import MyModel 1.0
 
Rectangle {
    width: 640; height: 320
 
    /* 使用MyModel模块的MyObject对象 */
    MyObject {
        id: myObject
        /* 设置text属性 */
        text: "12345"
        /* 读取打印text属性 */
        Component.onCompleted: console.log(text)
    }
}

3.通过调用Qml函数的方式

  使用invokeMethod可以调用Qml中的函数。通过设置Qml的实例,函数名字,输入参数和返回值即可调用Qml中的函数。

C++代码:

javascript 复制代码
QQuickWidget *view = new QQuickWidget;
view->setSource(QUrl("qrc:/View.qml"));
 
QVariant retVal;
QMetaObject::invokeMethod(view->rootObject(), /* Qml实例 */
                          "execute",         /* 函数名字 */
                          Qt::DirectConnection, /* 连接方式 */
                          Q_RETURN_ARG(QVariant, retVal), /* 标记返回值 */
                          Q_ARG(QVariant, "Hello"), /* 输入参数1 */
                          Q_ARG(QVariant, "world"));/* 输入参数2 */
qDebug() << "value: " << retVal;
view->show();

Qml代码:

javascript 复制代码
import QtQuick 2.0
import MyModel 1.0
 
Rectangle {
    width: 640; height: 320
    
    /* Qml函数,注意是在顶级控件下定义 */
    function execute(var1, var2) {
        console.log(var1, var2)
        return true;
    }
}
相关推荐
不想学习!!2 天前
Qt Quick 常用控件入门:Window、Button、CheckBox 与 RadioButton
qt·qml
人还是要有梦想的23 天前
QT qml布局讲解
qt·布局·qml
Rookie Linux1 个月前
使用Qt6 QML以及第三方库FluentUI、PCapPlusPlus开发一个自定义抓包软件
网络·c++·qt·cmake·qml
谁刺我心1 个月前
[QtCPP]Examples使用示例-QtMultimedia、QMediaPlayer、Audio音频引擎测试mp3播放
qt·音视频·qml
Quz1 个月前
Qt Quick 粒子系统(二):系统控制与生命周期管理
qt·qml·粒子系统
Quz1 个月前
Qt Quick 粒子系统(三):发射器深度解析
qt·qml·粒子系统
nnnnichijou1 个月前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
Quz1 个月前
Qt Quick 粒子系统(一):架构总览与四层模型
qt·架构·qml
Ulyanov1 个月前
深入QML-Python通信 构建响应式交互界面的桥梁设计:QML+PySide6现代开发入门(五)
开发语言·python·算法·交互·qml·系统仿真
东方.既白2 个月前
QML简易地铁导乘屏
qml