使用 QML 类型系统注册 C++ 类型

简介: 使用 QML 类型系统注册 C++ 类型

使用 QML_ELEMENT 和相关的注册宏来注册 C++ 类型到 QML 类型系统是一个非常强大的功能,它使得在 QML 中使用 C++ 类型变得非常方便。这里是一个详细的步骤说明,展示如何使用这些宏来注册一个 C++ 类,并确保它可以在 QML 中被正确使用。


步骤 1: 准备 C++ 类

首先,创建一个 C++ 类,例如 Message,并使用 QML_ELEMENT 宏进行标记。

message.h 文件:

#ifndef MESSAGE_H
#define MESSAGE_H

#include <QObject>
#include <QDateTime>
#include <QtQml/qqmlregistration.h>

class Message : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
    Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged)
    QML_ELEMENT // 这会注册类为 QML 类型

public:
    explicit Message(QObject *parent = nullptr);

    QString author() const;
    void setAuthor(const QString &author);

    QDateTime creationDate() const;
    void setCreationDate(const QDateTime &date);

signals:
    void authorChanged();
    void creationDateChanged();

private:
    QString m_author;
    QDateTime m_creationDate;
};

#endif // MESSAGE_H


message.cpp 文件:

#include "message.h"

Message::Message(QObject *parent)
    : QObject(parent)
{
}

QString Message::author() const {
    return m_author;
}

void Message::setAuthor(const QString &author) {
    if (m_author != author) {
        m_author = author;
        emit authorChanged();
    }
}

QDateTime Message::creationDate() const {
    return m_creationDate;
}

void Message::setCreationDate(const QDateTime &date) {
    if (m_creationDate != date) {
        m_creationDate = date;
        emit creationDateChanged();
    }
}

步骤 2: 配置项目文件

使用 CMake

在 CMakeLists.txt 文件中,使用 qt_add_qml_module 来注册 QML 模块,并指定适当的 URI 和版本号。

CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.16)

project(messaging)

find_package(Qt6 REQUIRED COMPONENTS Core Qml)

qt_add_qml_module(messaging
    URI com.mycompany.messaging
    VERSION 1.0
    SOURCES
        message.cpp message.h
)

set_target_properties(messaging PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
)

target_link_libraries(messaging
    PRIVATE Qt6::Core Qt6::Qml
)

使用 qmake

如果使用 qmake,需要在 .pro 文件中添加 QML 类型相关的配置。

messaging.pro 文件:

QT += core qml quick

CONFIG += qmltypes

HEADERS += message.h
SOURCES += message.cpp

# Define the QML module
QML_IMPORT_NAME = com.mycompany.messaging
QML_IMPORT_MAJOR_VERSION = 1
QML_ADDED_IN_MINOR_VERSION = 0

步骤 3: 在 QML 中使用 C++ 类

现在,Message 类已经注册为 QML 类型,可以在 QML 文件中直接使用。

main.qml 文件:

import QtQuick 2.15
import com.mycompany.messaging 1.0

Rectangle {
    width: 400
    height: 300

    Message {
        id: message
        author: "Amelie"
        creationDate: new Date()
    }

    Text {
        text: "Author: " + message.author + ", Created on: " + message.creationDate.toLocaleString()
        anchors.centerIn: parent
    }
}

总结

创建 C++ 类:定义类并使用 QML_ELEMENT 宏。

配置项目文件:使用 CMake 或 qmake 配置项目,使其能够生成 QML 类型注册信息。

在 QML 中使用:导入在 C++ 中注册的 QML 类型并在 QML 文件中实例化和使用它。

目录
相关文章
|
3月前
|
存储 程序员 C语言
c++primer plus 6 读书笔记 第四章 复合类型
c++primer plus 6 读书笔记 第四章 复合类型
|
10天前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
24天前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
29 0
|
2月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
29 6
|
2月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
48 11
|
2月前
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
51 5
|
1月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
23 0
|
2月前
|
C++ 开发者
C++一分钟之-概念(concepts):C++20的类型约束
【7月更文挑战第4天】C++20引入了Concepts,提升模板编程的类型约束和可读性。概念定义了模板参数需遵循的规则。常见问题包括过度约束、约束不完整和重载决议复杂性。避免问题的关键在于适度约束、全面覆盖约束条件和理解重载决议。示例展示了如何用Concepts限制模板函数接受的类型。概念将增强模板的安全性和灵活性,但需谨慎使用以防止错误。随着C++的发展,Concepts将成为必备工具。
62 2
|
2月前
|
编译器 C++
C++从遗忘到入门问题之C++中的浮点数类型问题如何解决
C++从遗忘到入门问题之C++中的浮点数类型问题如何解决
|
3月前
|
编译器 程序员 语音技术
C++的超20种函数类型分享
C++超20种函数类型:编程语言规定规则,编译器实现预定规则