QtQuick 可以使用内置的 JavaScript 引擎加载相应的 JS 代码,使用起来特别方便。

在 Qt 中使用 C++ 开发底层,QtQuick 用来加载、处理图像,然后使用 Qt 提供的接口保证两者能够正常通信即可。

1. 首先用Qt Creator新建项目,选择Qt Quick Controls 2 Application,命名项目…

2. 在资源文件qml.qrc中添加一个qml文件,命名…

3. 在qml文件中输入相应的元素(Item,Rectanger,Image,Canvas等等)。

 import QtQuick 2.0
import QtQuick.Window 2.2 Window {
width:
height:
visible: true
title: "Test window"
}

这里仅用了一个 Window 元素,加载后只显示一个空白的窗体。

4. 在main函数中加载qml引擎需要用到QQmlApplicationEngine类,通过该类加载qml文件。如下:

 int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv); QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/Test.qml")));
return app.exec();
9 }

其中,engine 对象的 load() 方法,需要一个QUrl对象提供qml文件的url路径,这里加载了一个qml文件,即“Test.qml”文件。

运行之后得到空白的窗体。如果想要显示不同的内容,需要在qml文件中添加相应的元素或自己编写控件再添加。

用 QQmlApplicationEngine 加载的 qml 文件可以使用 QML 的 Window 控件。

但是在c++ 的类方法中无法直接使用 QQmlApplicationEngine 类,若使用该类加载 qml 文件,会导致在触发显示窗口事件时,窗口显示一下立即消失,但是程序依然在运行,因此就无法对qml窗口进行操作。

 void Data::view() {
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/Test.qml")));
}

在Data类的view()方法中使用 QQmlApplicationEngine load() 方法无法正常显示窗口。

那么,如何在方法中调用加载 qml 文件呢?

要在 c++ 文件中显示qml文件的内容,Qt 提供了 QQuickView 类(QtQuick1.0则是使用 QDeclaritiveView 类,但是该类在加载 qml 文件时,响应缓慢)使用 QQuickView 即可加载 qml 并显示内容。

 void Data::view() {
QQuickView *compassview = new QQuickView;
compassview->setSource(QUrl(QStringLiteral("qrc:/Compass.qml")));
// compassview->rootContext()->setContextProperty("dataRadius", this);
QQmlContext *context = compassview->rootContext();
context->setContextProperty("dataSource", this);
// 设置窗口图标
QIcon icon = QIcon(QStringLiteral(":/img/compass.ico"));
compassview->setIcon(icon);
// compassview->set
// 设置窗口缩放时,根对象也会随之缩放
compassview->setResizeMode(QQuickView::SizeRootObjectToView);
compassview->setTitle("Compass heading pitch & roll");
compassview->show(); }

compassview 指向一个 QQuickView 对象,setSource() 方法指定该 QQuickView 对象所要加载的qml文件。

而 compassview->rootContext() 则是获取对象的根元素上下文,然后用 context 对象的 setContextProperty(const QString *, const QVariant*) 方法设定上下文属性,即可通过 QVariant 指针从 C++ 向 QML 传递数据。

然而如果qml文件是以 Window 作为根元素的话,QQuickView加载时会出现一个警告,因为QQuickView继承自QQuickWindow(又继承自QWindow),它本身就是一个窗口类,如果再用 QML 的 Window 控件作为根元素,自然会出现警告,可以忽略掉该警告,也可以将 Window 改成 Item (但要注意,Window 的有些属性在 Item 中不存在),这样就不会出现警告了。

然后在 qml 文件中通过设定一个定时器 Timer,可以定时从 c++ 中获取数据。

     /*
* 设置一个定时器,每隔 500ms 就从数据源中读取数据,修正图像
*/
Timer {
id: updateTimer
interval: 500
running: true
repeat: true onTriggered: {
// console.log("Timer is triggered! ")
// var data = DataSource.getData();
var data = dataSource.getRadius() data = [0, 0, 0]
// h_refresh(data[0])
refresh(data[0], data[1], data[2])
}
}

qml中 dataSource 需要与上面的 setContextProperty(“dataSource”, this) 语句中的 dataSource 同名(这样就可以直接调用相关对象的方法,比如 getRadius() 方法),否则 qml 将无法获取数据。

C++ 中设置 QQuickView 的窗口图标、标题等等与 QWindow 类似。

compassview->setResizeMode(QQuickView::SizeRootObjectToView) 设置了根对象大小随窗口大小改变而改变。这样就能动态缩放qml内容。

--------------------------------------------------------------------------------

另外需要注意的是,如果先用 Qt 新建了一个 Qt 应用,想要再添加 qml 文件并运行,需要修改项目的 .pro 文件,添加以下内容:

QT += qml quick

这样,在编译时才不会出错。

====================================================

另外,附上完整的代码

https://github.com/GitFuture/Compass

QtQuick 中的 qml 与 Qt 的 C++的更多相关文章

  1. QML与Qt C++ 交互机制探讨与总结

    介绍 QML和 C++对象可以通过,signals,slots和 属性修改进行交互.对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面介绍) ...

  2. Qt Widgets、QML、Qt Quick的区别

    Qt Widgets.QML.Qt Quick的区别 简述 看了之前关于 QML 的一些介绍,很多人难免会有一些疑惑: Q1:QML 和 Qt Quick 之间有什么区别? Q2:QtQuick 1. ...

  3. QML与Qt C++ 交互机制探讨与总结(转)

    原文转自 https://www.cnblogs.com/aoldman/p/4103510.html 介绍 QML和 C++对象可以通过,signals,slots和 属性修改进行交互.对于一个C+ ...

  4. 在 C++ 中使用 QML 对象

    看过了如何在 QML 中使用 C++ 类型或对象,现在来看如何在 C++ 中使用 QML 对象. 我们可以使用 QML 对象的信号.槽,访问它们的属性,都没有问题,因为很多 QML 对象对应的类型,原 ...

  5. qml(Qt Quick)做界面

    qml(Qt Quick)做界面 来源  https://www.zhihu.com/question/24880681/answer/29324824 本人是Qt初学者,正在写一个会计小软件(Lin ...

  6. Best Practices for QML and Qt Quick

    Despite all of the benefits that QML and Qt Quick offer, they can be challenging in certain situatio ...

  7. Qt widget中使用QML自定义电池

    1.效果 2.QML 在资源里新建Mybattery.qml: import QtQuick 2.0 import QtQuick 2.12 Item { id: root property colo ...

  8. [转载]震惊!QWidget竟然可以嵌入到QML中,QMl窗口句柄竟然是这样获取

      背景 记得在初学qml时,就被大佬告知Qml的实现有两种方式“view+item”和“engine+widow”,那么能不能将QWidget嵌入到QML中来呢,我收到的答案是不可以,原因是QML的 ...

  9. QML用Qt.labs.settings实现保存用户设置

    举个简单的例子: main.cpp中设置程序信息 QGuiApplication::setApplicationName("Gallery"); QGuiApplication:: ...

随机推荐

  1. spring mvc 返回页面数据

    handler package com.stone.controller; import java.util.Map; import javax.servlet.http.HttpServletReq ...

  2. Oracle中 Instr 这个函数

    http://www.jb51.net/article/42369.htm sql :charindex('字符串',字段)>0 charindex('administrator',MUserI ...

  3. MySQL锁详解

    一.概述 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.My ...

  4. 理解javascript中的Function.prototype.bind

    在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...

  5. Java内部类之匿名内部类

      我们都知道Java中可以使用内部类,将一个类的定义放在另一个类的定义的内部,这就是内部类,但是匿名内部类往往使我们摸不着头脑,因为它并没有特定的名称,那么该如何使用它呢? 定义一个匿名内部类 pu ...

  6. Android名片扫描识别系统SDK

    Android名片扫描识别系统SDK 一.Android名片扫描识别系统应用背景 这些年,随着移动互联的发展,APP应用成爆发式的增长,在很多APP中都涉及到对名片信息的录入,如移动CRM.移动端OA ...

  7. Hbase数据库安装

    一.环境准备 1.Ubuntu14.04-server 2.ssh 3.jdk1.6 4.hbase-0.98.19-hadoop2-bin.tar.gz(下载地址http://www.apache. ...

  8. R语言爬虫 rvest包 html_text()-html_nodes() 原理说明

    library(rvest) 例子网页:http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=010000% ...

  9. linux文本处理常用指令总结

    引子 作为一个偏爱windows的程序员,以前做文本处理的时候总是喜欢在windows下用notepad++等图形化工具处理,比如有时需要把linux服务器上一个文件进行一次全局字符串替换这样简单的操 ...

  10. 遍历hashMap对效率的影响

    测试环境:jdk1.7.0_79\Processor 1.7 GHz Intel Core i5 遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value. 写了两个方法: pu ...