QML工程化应用之客户端多窗口
pilgrim11已关注
2021.07.25 15:01:37字数 634阅读 132
一般客户端应用都是单个窗口,但随着用户越来越多的使用双屏显示器,则客户端多窗口的需求随之产生。当一个系统比较复杂时,用户想同时观察分在两个页面的功能,这也需要有多窗口功能。
具体需求:当前页面内容可以从主窗口分离出来,由用户拖拽到任意位置,用户使用完毕后,还可以将分离出来的窗口内容收回到主窗口原位置。
当时接到这个需求时,完全没有思路,后来忽然意识到QML本身是支持使用createObject()动态创建窗口的,一般用在模态对话中,如果使用非模态,则是我们的需求。有窗口了,内容如何跟着窗口分离出去呢?QML中的可视化元素Item有一个属性parent,顾名思义就是父元素,如果把当前内容元素的父窗口该为动态创建出来的窗口,是不是当前内容就跟着跑到其他窗口上去了呢。实现如下:
首先,初始化多窗口,设置不显示 visible:false,将窗口对象放在数组otherWinArray中管理。其中CommonWindow.qml是公共窗口控件,基于QT基础控件Window改写而成,主要是添加了产品需要的样式,此处使用Window.qml 也是一样的效果。
初始化多窗口
当要将当前页面分离出去时,需要先获取当前页面的item,然后设置item.parent为分离窗口的子元素。绿色框是获取当前页面对象,红框是设置父元素为刚创建出来的窗口。contentRect是CommonWindow自定义属性,即内容需要显示区域元素对象。设置窗口可见visible:true。则当前页面内容就随着动态窗口分离了出去。
绿框和红框为主要代码
当想把分出去的内容收回到主窗口时,同样的道理,将内容的item.parent设置为原父窗口元素,则分出去的内容就乖乖的回来了。
其他注意的就是页面宽高变化,多窗口分发时要管理好窗口和页面的关系,不要发出去的内容,收回来时变成其他页面的内容。