• Qt-QML-QML调用C++类


    QML用来做界面,在不考虑数据的请款下,那是溜溜的,但是,程序是没有不和后台数据交互的,但是了,QML在数据处理方面的效率又是不敢恭维的,这里就出现了QML负责前端界面,而后端使用JS或者C++了。

    那么,QML调用C++有两种方式,这里详细需要看以为大神提供的内容,放上大神链接http://blog.csdn.net/foruok/article/details/32698603

    这两就讲一下这两种调用的区别及用法

    注意 下面的内容都是按照我的理解来的,如果有什么错误,还请指出

    上结构图


    第一种方式,把一个C++类注册成为一个QML的全局属性,这样,这个属性在任何时候任意地方都可以被QML文件调用,就和每一个QML空间的属性一样简单

    我的PCpp类就是被我注册成为了一个QML的全局属性

    下面是详细代码

    PCpp.h

    #ifndef PCPP_H
    #define PCPP_H
    
    #include <QObject>
    
    class PCpp : public QObject
    {
        Q_OBJECT
    public:
        explicit PCpp(QObject *parent = 0);
        Q_INVOKABLE void showLog();
    };
    
    #endif // PCPP_H
    


    PCpp.c

    #include "pcpp.h"
    #include <QDebug>
    PCpp::PCpp(QObject *parent) : QObject(parent)
    {
    
    }
    
    void PCpp::showLog()
    {
        qDebug()<<"PCpp";
    }
    


    没有具体的内容,这里就是输出了一行LOg

    运行截图

    第二种方式了,在我理解看来,就是吧C++注册成为一个QML的组件,类似BUtton等空间

    那么在中方式,首先需要注意的就是

    必须在QML程序之前创建,不然QML不识别

    还有就是,当我们想要使用的时候,是必须初始化出来这个组件才可以了,这个在跨文件使用的时候会有许多问题。

    上详细代码

    TCpp.h

    #ifndef TCPP_H
    #define TCPP_H
    
    #include <QObject>
    
    class TCpp : public QObject
    {
        Q_OBJECT
    public:
        explicit TCpp(QObject *parent = 0);
        Q_INVOKABLE void showLog();
    };
    
    #endif // TCPP_H
    


    TCpp.cpp

    #include "tcpp.h"
    #include <QDebug>
    TCpp::TCpp(QObject *parent) : QObject(parent)
    {
    
    }
    
    void TCpp::showLog()
    {
        qDebug()<<"TCpp";
    }
    



    运行截图

    QML文件调用

    import QtQuick 2.5
    import QtQuick.Controls 1.4
    
    import TCpp 1.0
    
    ApplicationWindow {
        visible: true
         640
        height: 480
        title: qsTr("Hello World")
    
        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                Demo1.showLog()
                mytcpp.showLog()
            }
        }
    
    
        TCpp
        {
            id:mytcpp
        }
    
    
    
    }
    



    这里剩下最为关键的,就是C++的注册部分

    #include <QApplication>
    #include <QQmlApplicationEngine>
    #include <QQmlContext>
    #include "pcpp.h"
    #include "tcpp.h"
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        qmlRegisterType<TCpp>("TCpp",1,0,"TCpp");
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        QQmlContext *context = engine.rootContext();
    
        PCpp *damo1 = new PCpp();
    
        context->setContextProperty("Demo1",damo1);
    
    
    
    
    
        return app.exec();
    }
    


    第一种方法就是使用

    setContextProperty("Demo1",damo1);

    第二种方法使用

    qmlRegisterType<TCpp>("TCpp",1,0,"TCpp");

    注意,这句话必须卸载QML引擎的前面,不然是没法使用的

  • 相关阅读:
    kafka-python基本使用
    RabbitMq 消息队列详解
    Socket 编程
    python 进程, 线程 ,协程,锁,协程应用到爬虫的讲解
    python中with的用法
    为什么 Elasticsearch 需要堆内存来存储数据
    面向数据的架构
    跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)
    跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)
    跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160020.html
Copyright © 2020-2023  润新知