0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术使用QML进行界面开发简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-07 10:32 次阅读

1、概述

ESM6802是英创公司推出的基于Freescale i.MX6DL双核处理器(ARM Cortex-A9,主频1GHz)的高性能工控主板,imx6dl内部带有硬件3D、2D图像处理模块,能够对图像界面绘制进行硬件加速,使得应用程序显示更加快速流畅。ESM6802支持Qt 5.8版本,支持使用QML进行界面开发,而且能够利用硬件图像加速处理模块优化QML构建的图像界面的渲染。本文将会简单介绍一下QML的基础知识,给客户提供一种新的界面的开发方案。

QML是Qt提供的一种描述性的脚本语言,类似于CSS(Cascading Style Sheets),可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便。采用QML加插件的方式主要是为了将界面设计与程序逻辑解耦,一般的系统开发中界面设计的变动往往多于后台逻辑,因此采用QML加插件的方式将界面设计与逻辑分离有利于开发人员的分工,加速产品迭代速度,降低后期维护成本。而且QML解释性语言的特性使得其语法更加简单,可以将界面设计部分交给专业的设计人员开发,而不要求设计人员会c++等编程语言。Qt底层对QML做了优化,将会优先使用硬件图形加速器进行界面的渲染,也针对触摸屏应用做了优化,使用QML能够更简单快捷的搭建流畅、优美的界面。QML也支持嵌入Javascript处理逻辑,但是底层逻辑处理使用Qt C++编写插件,能够更好的控制数据结构,数据处理也更加高效,Qt提供了多种方式将C++数据类型导入QML脚本中,更多详细资料可以查看Qt官方的文档,本文将简单介绍一下QML语言的语法以展示QML相对于以往的Qt C++界面编程的区别,文中所有代码均在ESM6802 Linux上运行测试过了,有需要的客户可以向我们索取,QML文件是脚本文件,不需要编译,可以使用/usr/bin/qt5/qmlscene程序直接打开QML脚本文件查看效果。

2、QML基础介绍

QML将界面分解为一个一个小的元素,通过使用QML描述各元素的排列以及对特定事件的响应来搭建一个动态的界面。QML中的元素是以层级的形式进行描述的,子元素继承父元素的坐标系统,子元素的坐标以父元素作为参考,父元素的左上角为子元素的坐标原点,子元素中可以以parent关键字引用父元素。

在一个QML文件中,每个元素都可以设定唯一的id,在其他元素中可以引用id来更改此元素的属性等。QML提供一系列内置的元素类型供开发中快速搭建界面,包括最常用的Rectangle、Image、Text、MouseArea、Item等。元素都有自己内置的属性,比如之前介绍的id,以及用于指定坐标的x、y,和width、height等,同时也支持使用property关键字自定义属性。一个简单的QML文件如下:

import QtQuick 2.0
Rectangle {
width: 100
height: 100
color: "red"
}

这个QML文件将会展示一个红色的正方形,如下图:

在上面的例子中为Rectangle增加radius属性的设置就可以得到圆角长方形:

Rectangle {
width: 100
height: 100
color: "red"
radius: 10
}

使用Rectangle就可以构建出消息展示框和按钮等大部分的界面元素了,而Text类型可以用于在Rectangle中增加文字信息,Image可以加载图片,MouseArea提供鼠标/触摸屏事件,组合使用这几个元素就能够快速的搭建基本的交互界面了。

当然现实开发中由于需要展示的数据往往会以数组等更复杂形式进行管理,他们具有相同的属性,需要展示的外形效果(背景、对事件的相应)是一样的,而每个元素的需要展示的内容不一样,这时就可以使用Row、Column、ListView、GridView等更复杂的元素。这类元素的设计理念是将数据与展现效果分开,数据用model来存放,而展示效果用view来描述,model和view通过delegate联系起来,一个简单的ListView的用法示例如下:

Background {
width: 480
height: 80
ListView {
anchors.fill: parent
anchors.margins: 20
spacing: 4
clip: true
model: 100
orientation: ListView.Horizontal
delegate: numberDelegate
}
Component {
id: numberDelegate
GreenBox {
width: 40
height: 40
text: index
}
}

上面中的GreenBox是使用Rectangle元素和Text元素构建的长方形,上面的代码显示效果如下:

QML也内置了一些类型来描述显示元素的转变、动画效果,例如PropertyAnimation、NumberAnimation、ColorAnimation、RotationAnimation以及State、Transition等,使用这些类型能够快速实现界面的动画效果,比如下面展示一个绿灯闪烁的界面的QML代码:

import QtQuick 2.0
Rectangle {
id: backgroud
width: 100
height: 100
color: "grey"
Rectangle {
id: greenlight
width: 60
height: 60
x: 20
y: 20
color: "green"
radius: 30
Component.onCompleted: flick.start()
SequentialAnimation{
id: flick
ColorAnimation { target: greenlight; properties: "color"; to: "black"; duration: 1000 }
ColorAnimation { target: greenlight; properties: "color"; to: "green"; duration: 1000 }
ColorAnimation { target: greenlight; properties: "color"; to: "black"; duration: 1000 }
ColorAnimation { target: greenlight; properties: "color"; to: "green"; duration: 1000 }
ColorAnimation { target: greenlight; properties: "color"; to: "black"; duration: 1000 }
}
}
}

上面的代码会使id为greenlight的图形从绿色变为黑色,在由黑色变为绿色,重复三次,模拟绿灯闪烁的效果。由于动画效果不方便以图片展示,客户可以自行复制上面的代码运行查看效果。

从上面的介绍可以看到,QML的语法非常简单,整个文件的结构很清楚,比起使用Qt C++开发界面的更加简单快速,不需要管理各种不同的类(class),降低了编程难度,而且整个界面元素以长方形为基础来搭建,非常适合触摸屏设备。另外QML文件不需要编译,可以直接运行,搭建的界面能够快速的预览然后进行优化,也一定程度上加快了开发速度。当然由于QML的设计理念,QML只是对界面显示进行描述,虽然可以内嵌JavaScript处理数据,但是处理数据的效率不高,所以显示所需数据的生成、管理还是建议使用Qt C++进行处理。这样底层数据能够高效的进行处理,而上层界面又能够快速搭建,数据处理和界面构建分离,程序开发分工也更加明确,也更加方便程序的维护和更新换代。

3、使用C++扩展QML

Qt提供了C++的函数接口来方便的将C++程序中的数据提供给QML文件进行显示,这些接口可以分为两种,一种是直接在C++中注册QML类型,然后在C++中执行QML文件,这样QML文件中就可以直接访问注册的类型;另一种是创建QML插件,之后可以在QML文件中引入插件,作为独立的类型进行实例化。限于篇幅,我们这里只简单介绍一下创建QML插件,QML文件代码基于我们之前一片文章《Linux双进程应用示例》中介绍的,插件的功能我们不再具体介绍,只在此使用代码进行展示。

使用qtcreator的指导界面创建QML插件,设置插件名称为com.emtronix.qmlcomponents,在QML中通过语句import com.emtronix.qmlcomponents加载插件,插件编译过后以共享库的形式存在,需要放到/usr/lib/qt5/qml/com/emtronix/目录下:

插件使用Qt C++进行开发,实现插件的C++类需要继承QQmlExtensionPlugin类,并且实现registerTypes()函数,如下:

#include
class MsgClientPlugin : public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
void registerTypes(const char *uri);
};
void MsgClientPlugin::registerTypes(const char *uri)
{
// @uri com.emtronix.qmlcomponents
qmlRegisterType(uri, 1, 0, "MsgClient");
}

上面的代码qtcreator会自动生成,MsgClient类即为这个插件注册的新的QML类型,之后在QML文件中使用import语句加载插件,就可以在QML文件中实例化MsgClient类型了。

import com.emtronix.qmlcomponents 1.0
MsgClient{
id: msgclient
}

实现MsgClient类与Qt中其他的类类似,只要注意需要在QML中能访问的变量需要用Q_PROPERTY宏定义为MsgClient的属性,而需要在QML文件中访问的函数需要用Q_INVOKABLE进行修饰,如下:

class MsgClient : public QQuickItem
{
Q_OBJECT
Q_DISABLE_COPY(MsgClient)
Q_PROPERTY(int m_interface READ interface WRITE setif NOTIFY ifChanged)
Q_PROPERTY(QString rmsg READ rmsg WRITE setRmsg NOTIFY rmsgChanged)
Q_PROPERTY(QString smsg READ smsg WRITE setSmsg NOTIFY smsgChanged)
Q_PROPERTY(int serverConnection READ serverConnection NOTIFY serverConnected())
Q_PROPERTY(DynamicEntryModel* pinstate READ pinstate WRITE setPinState NOTIFY pinStateChanged)
Q_PROPERTY(DynamicEntryModel* outSwitch READ outSwitch WRITE setOutSwitch NOTIFY outSwitchChanged)
public:
MsgClient(QQuickItem *parent = nullptr);
~MsgClient();
Q_INVOKABLE void getAll();
Q_INVOKABLE void getNew();

使用slots定义的函数也可以在QML中直接访问,而使用signals定义的消息也可以在QML文件中访问:

public slots:
void sendMsg();
void setPinState(DynamicEntryModel* obj) { Q_UNUSED(obj) };
void setOutSwitch(DynamicEntryModel* obj) { Q_UNUSED(obj) };
……….
signals:
void ifChanged(int id);
void newMsgRcved(void);
void rmsgChanged(void);
void smsgChanged(void);
void sendMsgSignal(void);
void serverConnected(void);

这些函数以及变量都是正常的C++函数和变量,使用C++来实现函数需要实现的功能以及操作变量,例如sendMsg实现如下:

void MsgClient::sendMsg()
{
struct msg_head buf_h;
sprintf((char *)&buf_h.to[0], "S1");
int buf_lenth = m_smsg.size();
buf_h.lenth = buf_lenth;
printf("Client sending msg: %d bytes\n", buf_lenth);
write(sockedfd, (void *)&buf_h.to[0], 6);
write(sockedfd, (void *)m_smsg.data(), buf_lenth);
return;
}

signals信号的访问需要做一定的转换,例如上面的ifChanged消息,在QML中需要使用onIfChanged来访问,即将函数首字母大写,然后在前面加上‘on’。

MsgClient类型在QML中的实际调用如下:

MsgClient{
id: msgclient
m_interface: interfaceId.currentButton
onNewMsgRcved:{
getNew()
console.log("got new msg" + rmsg)
}
onIfChanged: {
console.log("interface changed to " + msgclient.m_interface)
getAll()
console.log("all history msg:" + rmsg)
}
onServerConnected: {
notReady.destroy()
}
}

可以见到MsgClient类型的使用和QML内置的类型使用没有什么区别,而插件中定义的signals消息以及其他可调用的函数方法也可以在QML中直接访问,MsgClient本身并不会产生显示输出,只是处理数据然后提供给QML其他的类型进行显示。我们使用QML搭建了整个显示界面,显示效果如下:

有兴趣的客户可以向我们索要例程的源码文件。

4、总结

ESM6802带有GPU硬件加速模块,能够加速QML的渲染,而且QML语法简单,使用QML进行程序开发能够快速的构建流畅的交互式界面,同时使用QML开发使得界面开发与程序数据处理、硬件管理分开,明确程序开发的分工,降低程序维护成本。对于工业控制系统来说,将界面与底层硬件管理分开,一定程度上增加了底层硬件管理部分的程序的稳定性,而界面又可以实现快速的迭代,适应市场的需求,用户在使用过程中可以考虑使用这种方式进行程序开发。有兴趣的客户可以参考更多的网上资料以及Qt的官方文档。在ESM6802的使用过程中如有问题可以和我们联系。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10994

    浏览量

    206782
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34625
收藏 人收藏

    评论

    相关推荐

    5.0V参考二极管LM136A-5.0QML LM136-5.0QML数据表

    电子发烧友网站提供《5.0V参考二极管LM136A-5.0QML LM136-5.0QML数据表.pdf》资料免费下载
    发表于 04-08 09:27 0次下载
    5.0V参考二极管LM136A-5.0<b class='flag-5'>QML</b> LM136-5.0<b class='flag-5'>QML</b>数据表

    基于物联网、大数据、云计算等现代信息技术高速公路智慧消防平台解决方案

    安科瑞 程瑜 系统简介 1、概述 智慧消防云平台基于物联网、大数据、云计算等现代信息技术,将分散的火灾自动报警设备、电气火灾监控设备、智慧烟感探测器、智慧消防用水等设备连接形成网络,并对这些设备
    的头像 发表于 03-15 14:20 183次阅读
    基于物联网、大数据、云计算等现代<b class='flag-5'>信息技术</b>高速公路智慧消防平台解决方案

    阐述量子信息技术的研究现状与未来

    20世纪 80 年代, 科学家将量子力学应用到信息领域, 从而诞生了量子信息技术, 诸如量子计算机、量子密码、量子传感等. 这些技术的运行规律遵从量子力学, 因此不仅其原理是量子力学, 器件本身
    发表于 11-22 11:40 485次阅读
    阐述量子<b class='flag-5'>信息技术</b>的研究现状与未来

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    再次登榜|亿达科创入选“2023年度软件和信息技术服务竞争力百强企业”

    8月31日,在第二十五届中国国际软件博览会上,中国电子信息行业联合会发布了“2023年度软件和信息技术服务竞争力百强企业”榜单。 亿达科创凭借在企业规模、经营业绩、技术创新等方面的综合能力强
    的头像 发表于 09-12 16:29 521次阅读

    集成电路是现代电子信息技术的基础

    集成电路是现代电子信息技术的基础 随着科技的不断发展,集成电路技术已成为现代电子信息技术的基础之一。它的应用范围已经涉及到电子、通信、计算机、军事等行业,已经为人们的生活和工作带来了极大的便利
    的头像 发表于 08-29 16:25 1290次阅读

    泰伦新成果发布交流会线上直播预约开启

    信号的清晰度和逼真度,使得通话更加清晰、准确,提高语音交流的效率和舒适性,为用户提供更好的使用体验。 04 声纹识别突破性进展 启泰伦声纹识别技术再上一台阶。可同时注册多个身份认证,并在较短时间内进行
    发表于 08-15 14:31

    2023年国家级高职学校信息技术教师能力培训会圆满举行

    2023年国家级高职学校信息技术教师能力培训会圆满举行
    的头像 发表于 07-31 22:56 395次阅读
    2023年国家级高职学校<b class='flag-5'>信息技术</b>教师能力培训会圆满举行

    中科驭数成为证券基金行业信息技术应用创新知识库首批合作厂商!

    7月20日,证券基金行业信息技术应用 创新中心与中国信息通信研究院携手合作,正式上线了行业信息技术应用创新知识库, 旨在做好对行业信息技术应用创新工作的支撑,加强产业侧和行业机构之间的
    的头像 发表于 07-21 18:50 328次阅读
    中科驭数成为证券基金行业<b class='flag-5'>信息技术</b>应用创新知识库首批合作厂商!

    新一代信息技术浪潮下的DPU力量,中科驭数亮相2023中国互联网大会!

    7 月 18 日,由中国互联网协会主办,北 京经济技术开发区管委会、北京市通信管理局、工业和信息化部新闻宣传中心联合主办的 2023 (第二十二届)中国互联网大会如约而至! 中科驭数出席本次
    的头像 发表于 07-19 20:05 800次阅读
    新一代<b class='flag-5'>信息技术</b>浪潮下的DPU力量,中科驭数亮相2023中国互联网大会!

    寻迹智行上榜2023年相城区软件和信息技术服务业“雏雁”企业

    根据《相城区软件和信息技术服务业推动数字产业化发展“雏雁”企业评估规范》要求,经企业申报、板块推荐、形式审查、专家评审、实地走访等环节,共评选出2023年相城区软件和信息技术服务业“雏雁”企业34家,其中就包括苏州寻迹智行机器人技术
    的头像 发表于 06-28 15:51 298次阅读
    寻迹智行上榜2023年相城区软件和<b class='flag-5'>信息技术</b>服务业“雏雁”企业

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    信息技术
    中海达
    发布于 :2023年06月21日 11:45:49

    中科曙光参建国内首个信息技术领域产教融合共同体

    “新一代信息技术产业产教融合共同体”在京成立(简称“共同体”)。**该共同体是由中国电子学会联合国内信息技术行业重点职业院校与重点企业成立的。首批成员单位的11家新一代信息技术领域领先职业院校校长,以及9家行业知名企业领导共同出
    的头像 发表于 06-13 12:38 447次阅读

    【米尔MYD-JX8MMA7开发板-ARM+FPGA架构试用体验】十一、QT-HMI V2.0系统

    代码进行方便的交互,使用起来非常方便。QMl是一种高效的开发UI 的语言。QML(Qt Meta-Object Language,Qt元对象语言)是一种声明式编程语言,并且它是Qt框架
    发表于 05-23 09:34

    权威榜单发布!“2022-2023信息技术应用创新榜”隆重揭晓

    2023年5月8日,由信息化观察网、信息技术应用创新榜组委会组织发起的“2022-2023信息技术应用创新榜”评审结果正式公示。本次榜单征集旨在全面展示信创发展最新成果,遴选出信创细分领域创新
    的头像 发表于 05-09 09:40 858次阅读