返回

将 C++ 属性暴露到 QML (Qt 5.11)

见解分享

在 Qt 应用程序中,QML 是一个用于创建用户界面的声明性语言。QML 引擎和 Qt 元对象系统是紧密集成的,QObject 派生类的成员在经过很少量的处理后(或无需处理)都能够再 QML 中直接访问,因此可以简单地实现使用 C++ 代码扩展 QML。

C++ 中声明属性

为了在 QML 中访问 C++ 属性,我们需要先在 C++ 代码中声明这些属性。我们可以使用 Q_PROPERTY() 宏来声明属性。Q_PROPERTY() 宏接受三个参数:

  • 属性名称
  • 属性类型
  • 通知属性变化的信号(可选)

例如,我们可以在 C++ 代码中声明一个名为 "name" 的字符串属性如下:

class Person : public QObject {
  Q_OBJECT
  Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)

public:
  Person();
  QString getName() const;
  void setName(const QString &name);

signals:
  void nameChanged(const QString &name);
};

在 QML 中使用属性

一旦我们在 C++ 代码中声明了属性,就可以在 QML 中使用这些属性。我们可以使用属性绑定语法来访问和修改 C++ 对象的属性。属性绑定语法使用点号 (.) 来访问对象属性,例如:

import QtQuick 2.0

Person {
  name: "John Doe"
}

上面的 QML 代码创建一个名为 "person" 的 Person 对象,并将其 "name" 属性设置为 "John Doe"。

处理属性变化

当 C++ 对象的属性发生变化时,我们可以使用信号来通知 QML。我们在声明属性时可以使用 NOTIFY 来指定一个信号,当属性发生变化时,该信号将被触发。例如,我们在声明 "name" 属性时指定了 "nameChanged" 信号,当 "name" 属性发生变化时,"nameChanged" 信号将被触发。

在 QML 中,我们可以使用 onChanged() 函数来监听信号。例如,我们可以使用以下 QML 代码来监听 "nameChanged" 信号:

import QtQuick 2.0

Person {
  name: "John Doe"

  onNameChanged: {
    console.log("Name changed to:", name)
  }
}

上面的 QML 代码会在 "name" 属性发生变化时打印一条消息到控制台。

总结

在本文中,我们介绍了如何将 C++ 属性暴露到 QML 中。我们探讨了在 C++ 中声明属性、在 QML 中使用属性以及处理属性变化的不同方法。我们还提供了一些示例代码来演示如何使用这些技术。希望本文对您在 Qt 应用程序中使用 C++ 代码扩展 QML 有所帮助。