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
    width: 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引擎的前面,不然是没法使用的

 

 

posted @ 2017-06-03 16:58  DreamDog  阅读(411)  评论(0编辑  收藏  举报