我是一名Android开发出生,在大学学的是javaweb方向的开发,不能说javaweb方向的东西都精通,但是至少应该能捡的起来。因为个人的爱好“喜欢看到一些看起来炫酷的东西”所以开始了漫长的接近四年的开发之旅。也是因为工作的原因,开始接触linux的应用层开发。
学习的心得:从android学习的过程中,我明白了一件事,懂得站在巨人的肩膀上。在查询资料的过程中也发现,纵然qml的起源比android要早的多,但是网上关于qml的学习资料却没有android的多。作为一名android过来的,我开始分享工作中接触到的东西,希望对更多人有所帮助,试一次总结,也是一次分享。
记得有个门外汉,曾经问过我一个问题:“如果有个代码仓库,是不是所有的程序员都是从里面根据自己的需要复制黏贴就可以了?” 。我的回答是肯定的,只是目前对于代码仓库的筛选与查找是我们的工作。
在我做Android的时候我发现,很多原来可以从github上面找到的功能自己写了还有一堆的bug,而且非常痛苦,所以真的建议大家在写具体的功能之前,先去github上面找找,也许能帮助你。github上面可以过滤语言,大家可以过滤一下
qml
进行查看,目前基本上都是一些example。不过也非常的有帮助。
在我做公司安排的项目的时候,本着沿用android上面可以复用的知识点的原则,架构方面我选用了广受好评的facebook出的flux,有不懂的可以自行百度一下,原则就一个“事件分发,单向流动”。
qml界面和c++界面之间传递数据
qml与c++之间的交互天然的与flux架构一致。可以直接套用,所有的事件通过信号进行分发。与android的EventBus差不多。
qml传递数据给c++
一般用于传递qml【View】上面的一些操作。比方说点击事件,请求发起事件等等。
我使用的方式是,统一交给ActionCrateor.qml进行分发,这里涉及qml的单例方式,可以看这篇文章 要记得单例的使用要使用相对路径,比方说我本地的代码结构是
所以在别的目录里面使用就需要使用相对路径// /a/b/xxx.qml 相对于 /action/XActionCreator.qml的位置
import "../../action"
复制代码
为了保持一致,我这边都是使用json进行传递,而不使用对象类型进行传递
//qmldir
singleton ActionCreator 1.0 XActionCreator.qml
singleton Constant 1.0 Constant.qml
复制代码
// XActionCreator.qml
pragma Singleton
import QtQuick 2.0
import SigDispatcher 1.0
Item {
//"send_xxx(作用)" 命名的规则
//发送事件
function send_initData(){
//统一发送
//调用某个对象的信号
dispatcher.sendEvent("active","");
}
//切换专辑,重新请求
function send_getAlbumData(param){
//param 参数,请求参数,页数?cid?
dispatcher.sendEvent("album_get_new",param);
}
//c++的对象
SigDispatcher{
id:dispatcher
}
}
复制代码
此时需要在主入口处加上SigDispatcher
qmlRegisterType <SigDispatcher> ("SigDispatcher", 1, 0, "SigDispatcher");
复制代码
准备
//SigDispatcher.h
#ifndef SIG_DISPATCHER_H
#define SIG_DISPATCHER_H
#include <QObject>
#include <QString>
#include <QHash>
#include <QVector>
#include <QVariant>
#include "sig/si