简介
本文是《Qml组件化编程》系列文章的第五篇,涛哥将教大家,Qml与C++的交互。
Qml已经有很多功能,不过终归会有不够用或不适用的地方,需要通过与C++的交互进行功能扩展。
这回涛哥尝试把所有Qml与C++交互相关的知识点都写出来,做一个透彻、全面的总结。
顺便说一下,涛哥的TaoQuick项目正式开源了, 系列文章中的所有功能,包括动态换皮肤、切换多语言等等,都集成在了TaoQuick中,
同时涛哥也在TaoQuick中使用了持续集成(CI)技术,目前已经能够自动编译、发布Windows和 Macos平台的软件包,可以在github的Release界面下载体验。
互联网行业很流行的DevOps理念,在TaoQuick项目中得到了最佳的实践。
(linux平台的发布工具linuxdeployqt暂时还有点问题,涛哥后续会搞定的)
地址在这,赶快去star吧:https://github.com/jaredtao/TaoQuickgithub.com
C++访问Qml
c++访问Qml有两种方式: findChild和 QQmlComponent。
findChild
了解Qt的人都知道,Qt的很多对象是QObject的子类,这些QObject只要设置了parent,就是有父子关系的,会产生一棵 “对象树”。
只要有了根节点,树上的任意节点都可以通过findChild的方式获取到。
写个简单的TaoObject,来示意一下:
class TaoObject
{
public:
//构造函数,传递parent进来
TaoObject(TaoObject *parent = nullptr) : m_pParent(parent)
{
if (m_pParent)
{
m_pParent->appendChild(this);
}
}
//析构函数,析构children。即子对象自动回收机制。
~TaoObject()
{
for (auto *pObj : m_children)
{
delete pObj;
}
m_children.clear();
}
//获取name
const QString &getName() const
{
return m_name;
}
//设置name
void setName(const QString &name)
{
m_name = name;
}
//查找子Object
TaoObject *findChild(const QString &name)
{
//先检查自己的名字,是否匹配目标名字
if (m_name == name)
{
return this;
}
//遍