首页 > 编程语言 >qml使用c++的类

qml使用c++的类

时间:2024-03-17 16:12:16浏览次数:19  
标签:qml NAME ObjectTester c++ QML 使用 include TYPE define

QML使用C++的类

qmlobjectdefine.h

#ifndef QMLOBJECTDEFINE_H
#define QMLOBJECTDEFINE_H

#include <qobjectdefs.h>
#include <qqml.h>

#define QML_FUNCTION                                    Q_INVOKABLE
#define QML_MEMBER_NAME(NAME)                           m_##NAME
#define QML_SIGNAL_NAME(NAME)                           NAME##Changed

#define QML_MEMBER_VARIABLE(TYPE, NAME)                 TYPE m_##NAME
#define QML_MEMBER_SIGNAL(NAME)                         void NAME##Changed()
#define QML_PROPERTY(TYPE, NAME)                        Q_PROPERTY(TYPE NAME MEMBER m_##NAME NOTIFY NAME##Changed)

#define QML_CREATE_PROPERTY(TYPE, NAME)                 QML_MEMBER_SIGNAL(NAME); public:QML_MEMBER_VARIABLE(TYPE, NAME); QML_PROPERTY(TYPE, NAME);

#define QML_REGISTER_TYPE(NAME, MAJOR, MINOR)           qmlRegisterType<NAME>(#NAME, MAJOR, MINOR, #NAME);
#define QML_REGISTER_SINGLETON_TYPE(NAME, MAJOR, MINOR) qmlRegisterSingletonType<NAME>(#NAME, MAJOR, MINOR, #NAME, [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return new ObjectTester; })

#endif // QMLOBJECTDEFINE_H

c++的类注册到qml

#ifndef OBJECTTESTER_H
#define OBJECTTESTER_H

#include <QObject>
#include "qmlobjectdefine.h"

class ObjectTester : public QObject
{
    Q_OBJECT
public: signals:
    QML_CREATE_PROPERTY(QString, name)
public: signals:
    QML_CREATE_PROPERTY(int, age)
public:
    QML_FUNCTION QString output();
public:
    explicit ObjectTester(QObject *parent = nullptr);
};

#endif // OBJECTTESTER_H

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QDebug>
#include <QFontDatabase>
#include <qmlobjectdefine.h>
#include <objecttester.h>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
#if 1
    QMap<QString, int> objectMap;
    objectMap["ObjectTester"] = QML_REGISTER_SINGLETON_TYPE(ObjectTester, 1, 0);
    ObjectTester* instanceObjectTester = engine.singletonInstance<ObjectTester*>(objectMap["ObjectTester"]);
    instanceObjectTester->m_name = "张三";
    instanceObjectTester->m_age = 15;
#endif
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

import ObjectTester 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Component.onCompleted:  {
        console.log(ObjectTester.output())
        console.log(ObjectTester.name)
        console.log(ObjectTester.age)
    }
}

标签:qml,NAME,ObjectTester,c++,QML,使用,include,TYPE,define
From: https://www.cnblogs.com/yuanhaoblog/p/18078692

相关文章

  • 大学生学生证教育优惠使用JetBrains全家桶(Pycharm、IDEA、goland等)
    大学生学生证教育优惠使用JetBrains全家桶(Pycharm、IDEA、goland等)前提在读学生,有学生证或者教育邮箱。大学生、研究生、博士都可以申请JetBrains全家桶的免费使用。只要申请了一次之后就可以用申请的账号登录JetBrains的包括IDEA在内其他所有IDE。例如以下产品:申......
  • 在C#中使用 CancellationToken 处理异步任务
    来源:在C#中使用CancellationToken处理异步任务-知乎(zhihu.com)在.NETCore中使用异步编程已经很普遍了,你在项目中随处可见async和await,它简化了异步操作,允许开发人员,使用同步的方式编写异步代码,你会发现在大部分的异步方法中,都提供了CancellationToken参数,本文主要介......
  • C++20新特性-barrier
     以下内容由豆包大语言模型生成,内容仅供参考: C++20引入了一个新的标准库头文件 <barrier>,其中包含了对屏障(barrier)的支持。屏障是一种用于同步多个线程的同步原语,它允许线程在某个点上等待,直到所有线程都到达该点。C++20的 <barrier> 头文件提供了一个 std::barrier......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    ......
  • sessionInfo()使用技巧--是否事先library()的影响
    在没有使用对应R包的状态下使用命令sessionInfo(),不会显示该R包信息在使用对应R包的状态下使用命令sessionInfo(),会显示该R包及其关联R包的版本状态未library(ggplot2)时:sessionInfo()library(ggplot2)时:library(ggplot2)sessionInfo()......
  • 【经验】关于c++11中string类型字符串和整形相互转化的用法
    https://blog.csdn.net/Elephant_King/article/details/129225134 c++11中为我们提供了许多非常方便的函数,可以帮助我们在整形与string类型字符串进行转换关于Dev-c++如何使用c++11,因为本人是mac系统,使用cLion,无法安装Dev,可以在网上搜其他教程实现整形转字符串(to_string())to_s......
  • 常见排序算法(C/C++)--- 动画演示
        本篇将介绍一些常见的排序算法,如插入排序:直接插入排序、希尔排序;选择排序:选择排序、堆排序;交换排序:快速排序、冒泡排序;以及最后的归并排序。    对于以上的排序算法,我们总结了每种排序算法的特性,接着对直接插入排序进行了优化;然后实现了归并排序和快速排......
  • Android开发笔记[12]-使用AAR方式嵌入flutter页面
    摘要使用AAR方式嵌入flutter页面.关键信息AndroidStudio:Iguana|2023.2.1Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zipjvmTarget='1.8'minSdk21targetSdk34compileSdk34开发语言:Kotlin,JavandkVersion='21.1.635......
  • 【c++】vector
    vector的介绍及使用1.vector的介绍https://cplusplus.com/reference/vector/vector/vector是表示可变大小数组的序列容器就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以......
  • windows C++实现控制台应用程序隐藏后台运行
    C++实现程序隐藏后台运行,效果如下:方式一:#pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")  方式二:   ......