参考《c++ qt4编程(第二版)》19.2章节
一个QSpinBox的组成部分如下:
使用QStyle绘制默认的QSpinBox就会绘制这些元素:
这就是QStyle绘制的默认QSpinBox。
要绘制一个自定义的QSpinBox只需要在自定义的风格里面绘制这几个元素就行了。
从drawComplexControl函数开始绘制:
这里drawBronzeSpinBoxButton()函数用来绘制上下按钮,
即这两个
函数传入了整个QSpinBox的QStyleOptionComplex
绘制上按钮SC_SpinBoxUp的过程如下:
其中PrimitiveElement是原始元素,这里设置成向左和向右的箭头,也可以设置成别的,调用重载函数drawPrimitive()进行绘制,可以在该函数里自由绘制,如PE_IndicatorSpinUp默认绘制是一个上三角
你可以在这里自由指定当绘制PE_IndicatorSpinUp元素时绘制文字
然后是绘制文本框SC_SpinBoxEditField
重写函数subControlRect里面定义了子控件的绘制范围
效果:
总的来说使用qstyle绘制自定义的控件是非常繁琐的,一般不建议使用。
免费学习C++ Qt开发教程视频,点击下面链接免费报名领取视频学习资料
C/C++项目实战/Qt5/C语言/c++/数据库/OpenCV/MFC/QT项目-学习视频教程-腾讯课堂
按上一篇绘制自定义QSpinBox的过程,再来绘制一个QSpinBox。
设计图:
把按钮放上面
在这之前先看一下成品:
上一篇说了,绘制自定义QSpinBox实际上就是给QSpinBox中的这些原始组成元素指定好位置并绘制出来。
设计这些元素的尺寸如下:
即确定子控件位置的subControlRect()函数:
然后开始绘制:
绘制从drawComplexControl()函数开始,首先绘制上下按钮
这个函数用来绘制上下按钮的背景和按钮上面的图标
背景使用了线性渐变,如果没有好的渐变配色方案可以参考这里:收藏 | 四个免费的渐变配色网站!
这里绘制的时候使用了adjusted(+1, +1, -1, -1),即给四周留下了一点空间显得不拥挤。绘制完上下按钮的背景时的效果:
然后是绘制按钮的图标,
这里从subControlRect()获取上下按钮的范围之后再次压缩了范围
在此范围内绘制图标
这里设置了上下按钮分别使用PE_IndicatorSpinPlus / PE_IndicatorSpinMinus,默认是代表加减号的意思。
如果使用默认设置,在drawPrimitive()中直接调用 QProxyStyle::drawPrimitive(which, option, painter, widget);效果:
不太好看,我们按设计图给它画上三角形。
这里注意:
painter指针是绘制一开始起从drawComplexControl()函数传过来的,每次绘制前设置painter->save();保存设置绘制完成painter->restore();恢复设置,到drawPrimitive()绘制的原点还是在上下按钮的(0,0)点,设置painter->translate(option->rect.x(),option->rect.y());是将绘制的原点设为绘制图标的原点,就比较方便
下一步是给SC_SpinBoxEditField加上边框:
此时的效果:
到这基本完成,然而编辑框里的数字太小了,这里可以设置它的字体并设置文本居中:
最终效果:
样式完整代码:
.h文件:
public:
.cpp文件:
按照之前的方法再来绘制两个QSpinBox。
设计图:
根据这个设计图改写子控件位置:
绘制背景和图标:
其他的都和上一篇一样。
效果:
再来画最后一个,
和前面的整体区别不大就是椭圆形的
其他的地方不需要改,只需要改这里,绘制上下键背景的时候由绘制圆角矩形改成绘制弧形:
效果:
免费学习C++ Qt开发教程视频,点击下面链接免费报名领取视频学习资料
C/C++项目实战/Qt5/C语言/c++/数据库/OpenCV/MFC/QT项目-学习视频教程-腾讯课堂
原文链接:https://blog.csdn.net/kenfan1647/article/details/110680037
评论留言