目录
1.继承原生控件
2.组合原生控件
3.仿写原生控件
PS:后续将继续分享开发实践中各类自定义控件的方法、思路以及组件库
1.继承原生控件
关键字:继承、paintEvent
这里想说的是,Qt的Gui框架在封装原生控件的同时, 也为开发者提供了各种虚接口函数。如果Qt原生控件+QSS样式表的组合满足不了业务开发的风格需要时, 那么继承Qt原生控件、重写绘制关联虚接口函数一定是我封装控件的第一选择。
比如:下面虚线风格的滑动条
Qt原生风格的QSlider显然不可能达到该效果,那么继承QSlider类,然后重写虚函数QSlider::paintEvent,分别绘制groove、刻度线、进度以及滑块,就可以实现目标效果!
这里为什么要刻意强调继承原生控件呢?因为,继承了原生控件,你才能保持控件的基本功能接口的有效复用,而在paintEvent中,无论做什么绘制,都依赖于各个接口的返回结果(比如:滑动条的进度值)。当然,并不是所有的绘制都是简单的一个虚函数paintEvent可以搞定的,这个要具体问题具体分析!
2.组合原生控件
关键字:组合、布局
这里所说的组合原生控件是指:在原生控件的基础上布局新的子控件,以满足业务需求、实现新的自定义风格的控件。
举个例子:下图所示的带按钮的编辑框非常常见
而QLineEdit类显然不具备上述按钮功能,那么遵循该原则的实现思路就是:能否把一个按钮QPushButton布局在QLineEdit的右边,两个父子控件组合在一起的话是不是就达到了预期的效果了呢? 显然是可以的!
当然,上述控件的实现思路很多,每个开发者都会有自己的独特视角!
3.仿写原生控件
仿写原生控件当然是代价最高的一种自定义风格控件的实现方式!
这意味着,开发者要重新造轮子,根据目标效果另起炉灶、完全重写一个新的控件类。
比如,下图展示的时间选择控件:
显然,这个时间选择组件,由两部分组成,首先是一个可编辑时间的编辑框,其次,当点击时间值后,会在下面显示时间选择Popup弹窗。而且每一个子控件都是需要重新实现的新风格组件。
所以第三种情形下,就要开发者无所不用其极的实现渲染效果以及预期业务功能接口了。
PS:后续将继续分享开发实践中各类自定义控件的方法、思路以及组件库