把Widget 嵌进 Qml里的一个思路,cpp与qml通信方法(附源代码)

在qt项目开发中,不少项目开始使用qml进行界面的开发,但有时又会遇到需要将Widget加入Qml中的需求。把Widget嵌入Qml里边网上资料甚少,实现起来也很复杂。在此提供另一个思路来实现。

当使用quickwidget加载qml时,本质上就是把一个widget里边按照qml画出了界面,也就是说,其实本质上还是个widget。既然quickwidget最终还是个widget,且qml加入widget比较难实现,那么也可以放弃qml嵌入widget,将quickwidget视做widget,就简单了,毕竟widget嵌入widget仅仅是把父级指针指定为将要嵌入的父级窗口就行。联系到本文的问题也就是把Widget嵌入加载qml的quickwidget中来达到“嵌入”qml的效果,并通过注册类或者设置qml全局可访问对象的方法与其进行通信。
1:在加载qml的quickwidget中,将需要嵌入的widget在初始化时指定父级为this,也就是quickwidget本身,或者稍后使用setParent(this),与将widget嵌入widget一样.这里假设要嵌入的widget类叫做NeedEmbedInQml_Widget

NeedEmbedInQml_Widget *widgetObj;
widgetObj = new NeedEmbedInQml_Widget(this);

2:将嵌入的widget配置成qml能访问的,这里使用注册为qml全局可访问对象的办法。注册必须写在初始化后边否则会出错甚至直接闪退,setSource也最好写在注册后边

#include <QQmlContext>
...
widgetObj = new NeedEmbedInQml_Widget(this);
this->rootContext()->setContextProperty("widget1",widgetObj);
this->setSource("...");

此时与qml通信用的调用方法就可以写在对应的widget里并在qml访问,qml与cpp通信这里暂不展开细说了,若需要了解可以自行搜索或者看此工程里的qmlcppcomclass,qmlcppexample和QmlCppExample.qml

点击此处,查看qml与cpp通信的示例工程

widget内:
Q_INVOKABLE xxx
Q_PROPERTY(xxx)
signals: xxxx
xxx

若是嵌入的widget类不方便大加修改,也可以在把quickwidget注册为qml全局可访问对象,在quickwidget内写调用方法间接与widget通信

this->rootContext()->setContextProperty("widget1",this);
quickwidget内:
Q_INVOKABLE xxx(){widgetObj->xxx;}
Q_PROPERTY(val)	
set_val(widgetObj->xxx);
signals: xxxx
xxx

3:qml里就按正常的与cpp通信的写法去调用就行

function afunc(){
	widget1.xxx(xxx)
	xxx
}
...
text:widget1.xxx
...
Component.onCompleted{
widget1.signale.connect(function(){xxx})
}
xxx

以此思路嵌入的widget的背景颜色会变成与quickwidget一致,我用样式表和palette设置甚至raise()都没有用,所以对于需要改背景颜色的widget我就搁qml里在widget的对应位置画了个Rectangle.

以上相关的示例工程源码:
1:
把通信方法写到各自widget里
2:
把通信方法写到quickwidget里

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值