QML与C++之间的数据类型转换

本文详细讨论了QML和C++之间数据类型转换的规则和机制,包括数据所有权、基本Qt数据类型、QObject派生类型的注册、Qt和JavaScript类型之间的转换,以及QVariant、QDateTime、QTime等特殊类型的转换。QML引擎支持自动转换Qt数据类型到QML基本类型,同时也支持自定义类型注册,使得C++和QML能够无缝交互。
摘要由CSDN通过智能技术生成

在QML和C ++之间交换数据值时,它们将由QML引擎转换为具有适用于QML或C ++的正确数据类型。 这要求交换的数据具有引擎可识别的类型。

QML引擎为大量QT C++数据类型提供内置支持。此外,自定义C++类型可以注册到QML类型系统中,使它们可以用于引擎。

该页面讨论了QML引擎支持的数据类型以及如何在QML和C ++之间转换它们。

数据所有权

当数据从C ++传输到QML时,数据所有权始终由C ++保留。 该规则的例外情况是从显式C ++方法调用返回QObject时:在这种情况下,除非通过调用QQmlEngine将对象的所有权显式设置为与C ++一起使用,否则QML引擎假定该对象的所有权: 使用QQmlEngine :: CppOwnership指定的setObjectOwnership()

此外,QML引擎尊重Qt C ++对象的常规QObject父所有权语义,并且永远不会删除具有父对象的QObject实例。

基本Qt数据类型

默认情况下,QML识别以下Qt数据类型,当从C ++传递到QML时,它们会自动转换为相应的QML基本类型,反之亦然:

Qt Type QML Basic Type
bool bool
unsigned int, int int
double double
float, qreal real
QString string
QUrl url
QColor color
QFont font
QDateTime date
QPointQPointF point
QSizeQSizeF size
QRectQRectF
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
QMLC++数据绑定是双向的,即可以从 C++QML 发送数据,也可以从 QMLC++ 发送数据。 下面以一个简单的例子来说明 QMLC++ 数据绑定的实现方法。假设有一个包含两个整数变量的类 MyObject,我们想在 QML 中显示这两个变量的值,并且能够修改它们的值。 首先定义 MyObject 类: ```cpp class MyObject : public QObject { Q_OBJECT Q_PROPERTY(int value1 READ value1 WRITE setValue1 NOTIFY value1Changed) Q_PROPERTY(int value2 READ value2 WRITE setValue2 NOTIFY value2Changed) public: MyObject(QObject* parent = nullptr) : QObject(parent), m_value1(0), m_value2(0) {} int value1() const { return m_value1; } void setValue1(int value) { if (value != m_value1) { m_value1 = value; emit value1Changed(); } } int value2() const { return m_value2; } void setValue2(int value) { if (value != m_value2) { m_value2 = value; emit value2Changed(); } } signals: void value1Changed(); void value2Changed(); private: int m_value1; int m_value2; }; ``` 然后在 main.cpp 中创建一个 MyObject 实例并注册为 QML 类型: ```cpp int main(int argc, char* argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<MyObject>("com.example", 1, 0, "MyObject"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 在 QML 中,我们需要创建一个 MyObject 对象并绑定到一个 ID 上,然后使用 QML 的 `Binding` 来将对象的属性绑定到 QML 的属性上: ```qml import com.example 1.0 Rectangle { MyObject { id: myObject } Text { text: "Value1: " + myObject.value1 } Text { text: "Value2: " + myObject.value2 } TextInput { text: myObject.value1.toString() onTextChanged: myObject.value1 = parseInt(text) } TextInput { text: myObject.value2.toString() onTextChanged: myObject.value2 = parseInt(text) } } ``` 这样就可以实现 QMLC++ 数据的双向绑定了。注意,需要在 QML 中使用 `MyObject {}` 创建一个对象,并将其绑定到一个 ID 上,才能访问其属性。在 TextInput 中需要使用 `parseInt()` 函数将输入的文本转换为整数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值