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",,,"TCpp");

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

Qt-QML-QML调用C++类的更多相关文章

  1. 29.qt quick-在QML中调用C++类

    1.Qml调用C++类 Qt QML模块提供了一组API,用来将C++类扩展QML中.您可以编写扩展来添加自己的QML类型,扩展现有的Qt类型,或调用无法从普通QML代码访问的C/C++函数本章将学习 ...

  2. 在 QML 中使用 C++ 类和对象

    Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ...

  3. QT创建与调用Dll方法(包括类成员)--显式调用

    看网上的好多关于QT调用Dll的方法,大部分都是调用函数的,并没有调用C++类成员的情况,即使是有,比如说: 使用Qt编写模块化插件式应用程序 Qt 一步一步实现dll调用(附源码)---(这一篇里没 ...

  4. Qt一个project调用还有一个project的类成员变量

    一句两句话已经不能表达如今的激动情绪了.唯有感叹知识的博大精深,并把感叹转变为文字. 同一个project调用其它类成员变量很easy. 如: 定义 Test1.h中申明成员变量 class A { ...

  5. QT 安卓 调用java类

    用以下方式即可调用java类中的方法 QAndroidJniObject activity = QtAndroid::androidActivity(); QAndroidJniObject Devi ...

  6. QT中QProcess调用命令行的痛苦经历(调用Winrar,设置工作目录,获得输出,注意引号与括号,等等)

    QT中QProcess调用命令行的痛苦经历   阅读目录 创建压缩包的方法 在QT中调用命令行 在QT中调用C++创建的dll 在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在Q ...

  7. Qt 中用QProcess调用cmd命令

    项目做到一定阶段,常常须要在原来的project上调用外部程序. Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 基本用法: QProcess p(0); ...

  8. QT学习之文件系统读写类

    #QT学习之文件系统读写类 QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileIn ...

  9. qt 创建及调用QT的 DLL

    先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...

随机推荐

  1. Linux实用指令(2)

    cat指令     cat 查看文件内容,只读的方式 • 基本语法     cat [选项] 要查看的文件 • 常用选项     -n :显示行号 • 应用实例   注意:cat 只能浏览文件,而不能 ...

  2. 谈谈Ajax(一)

    解决办法是:比如我是使用SSM框架(Spring+SpringMVC+MyBatis/MyBatis Plus)开发web应用,通常Controller的参数列表与ajax的data保持一致即可,少一 ...

  3. CPP-基础:临界区

    VC windows api 多线程---临界区 临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问.如果有多个线程试图同时访问临 ...

  4. Collections.synchronizedList线程安全性陷阱

    摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedLi ...

  5. 【洛谷P2022】有趣的数

    有趣的数 题目链接 首先求出1~k中有多少个在k前面的数的个数,若>m,则无解 比如12345,从第一位开始, 1 0~1 共2个 1-0+1 12  10~12共3个    12-10+1 1 ...

  6. jquery特效 点击某项,其它隐藏

    <html> <head> </head> <body> <script> $(function(){ $(".cPage a&q ...

  7. AltiumDesigner16笔记

    集成库(*.intlib)没有办法直接修改库文件,但是*.schlib可以编辑的. 原理图元件批量修改可以从Tools-> Update from libraries进行. PCB封装批量修改: ...

  8. Linux -- date 日期命令

    Linux -- date 日期命令 date 用法:date [选项]... [+格式] 以给定的格式显示当前时间,或是设置系统日期. 1.使用 date 命令查看当前日期或当前时间 [root@l ...

  9. mysql 使用order by

    1.mysql 使用order by field() 自定义排序 order by field(value,str1,str2,str3,str4......strn) 例如:select * fro ...

  10. iOS 文件下载及断点续传

    ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...