文章目录

  • 本博文的简述or解决问题?
  • 系列博文:
  • 系列文章:
  • 运行效果:
  • 区别:
  • PenStyle介绍:
  • CustomDashLine使用方法:
  • 用于项目:
  • 更新2020-07-25:重绘滑动槽细节
  • 开心分享:
  • 系列地址:

简介: QStylePenStyleCustomDashLine使用,使用自定义风格样式的画笔;本篇例子来自绘画 Deepin v20DTKDSlider 控件滑槽。

本博文的简述or解决问题?

详情: 见简介

编程环境: deepin 15.11 x64 专业版 Kernel: x86_64 Linux 4.15.0-30deepin-generic

编程软件: Qt Creator 4.8.2 (Enterprise)Qt 5.9.8

系列博文:

  • QStyle自定义重绘QSlider控件
  • QStyle之PenStyle的CustomDashLine使用 【更新:更加精准的绘画滑槽】
  • 重绘的QStyle中sizeFromContents()没有被调用
  • QStyle自定义重绘QSlider控件二(重要)

系列文章:

运行效果:

  • 设计师给的图片:

  • 第一次绘画效果(2019-09-01):

  • 第二次修改效果(2019-09-03):

  • 第三次修改效果(更新2020-07-25:重绘滑动槽细节):

区别:

其中第一次绘画,和第二次绘画滑槽,都是使用划线void QPainter::drawLine(const QLineF &line) 来进行绘画的,之前是使用系统自带的Qt::DotLine风格,而现在是使用自定义样式的Qt::CustomDashLine风格绘画;原因是系统自带Qt::DotLine的虽可以控制pen.setWidthF(3);线的粗细,但是不能控制其高度(保持宽度和间隔不变的情况下);很难长得和设计图一样。

PenStyle介绍:

想看一下enum Qt::PenStyle的官方文档:一共有7(统风格)+1(自定义风格)的样式:

CustomDashLine使用方法:

官方教程如下:使用void setDashPattern(const QVector<qreal> &dashPattern) 函数

译文如下:

将此笔的虚线模式设置为给定模式。这隐式地将笔的样式转换为Qt :: CustomDashLine。
必须将模式指定为偶数个正条目,其中条目1,3,5 …是短划线,而2,4,6 …是空格。例如:

QPen pen;
QVector dashes;
qreal space = 4;
dashes << 1 << space << 3 << space << 9 << space << 27 << space;
pen.setDashPattern(dashes);

仪表板图案以笔宽度为单位指定;例如宽度为10的长度为5的长度为50像素。请注意,宽度为零的笔相当于宽度为1像素的化妆笔。
每个破折号也受制于帽子样式,因此带有方帽设置的短划线将在每个方向上延伸0.5像素,从而导致总宽度为2。
请注意,默认的上限样式是Qt :: SquareCap,这意味着方形线末端覆盖终点并超出线宽的一半。
另请参见setStyle(),dashPattern(),setCapStyle()和setCosmetic()。

其中具体使用如下:

其中便是绘画一条(自定义)的线:其线的一个完整的周期为(单位为像素):

1(线段) 4(间隔) 3(线段) 4(间隔) 9(线段) 4(间隔) 27(线段) 4(间隔)

注意:其中dashes只能够出现为偶数对,不可为奇数个;

用于项目:

首先贴出第一次的"绘画滑槽"代码(局部):

QPen pen;
//绘画 滑槽(线)
if (opt->subControls & SC_SliderGroove) {pen.setStyle(Qt::DotLine);pen.setWidthF(3);pen.setColor(getColor(opt, QPalette::Highlight));p->setPen(pen);p->setRenderHint(QPainter::Antialiasing);p->drawLine(QPointF(rectGroove.left(), rectHandle.center().y()), QPointF(rectHandle.left(), rectHandle.center().y()));pen.setColor(getColor(opt, QPalette::Foreground));p->setPen(pen);p->drawLine(QPointF(rectGroove.right(), rectHandle.center().y()), QPointF(rectHandle.right(), rectHandle.center().y()));
}

另外一个绘画方法是,在规定大小矩形内,绘画n多个小矩形,充当滑槽,但是可能需绘画多个小矩形来实现(考虑到效率开销),得到细密的线的效果;其使用for循环 遍历绘画很多次 (同样也是大的),所以此方法被否定了。

只需要上面的pen.setStyle(Qt::DotLine);(第四行)修改为如下代码

pen.setStyle(Qt::CustomDashLine);QVector<qreal> dashes;qreal space = 1.3;dashes << 0.1 << space;pen.setDashPattern(dashes);

即可得到这次的效果:

更新2020-07-25:重绘滑动槽细节

前面一段时间,Slider 实际上是没有完全 100% 达到设计图的样式要求的(惭愧),后腾出手来,决定将其改一下,还原设计图的滑槽样式:其中具体的详细提交如下:#8895abb7

其中的困难点是,设置画笔的高度、宽度、实线与虚线的间隔(要求在苹果的高分屏放大看细节后,且不会出现错误的模糊偏移);

在开发的普通屏幕中,可以安装 eog, 然后左上角的设置里关掉平滑,再次查看图片放大看,就不会糊掉了,可以清晰的看到下面的实先和虚线偏移重叠;

给上最后的解决参数方案。

pen.setStyle(Qt::CustomDashLine);
pen.setWidth(4);
pen.setBrush((opt->activeSubControls & SC_SliderHandle) ? getColor(opt, QPalette::Highlight) : opt->palette.highlight());
pen.setDashOffset(0);
pen.setDashPattern(QVector<qreal>()<< 0.5 << 0.25);  // 这个数值是最接近其原图, 且放大之后,不会有模糊偏移
pen.setCapStyle(Qt::FlatCap);
p->setPen(pen);
p->setRenderHint(QPainter::Antialiasing);

放上一张最后的效果图:

开心分享:

因为有着许许多多的热心网友的无私分享,从他们的博客中学习成长,学会很多,故也不辞辛苦也将自己的项目或经验整理成博客的形式,也提供给一起大家学习探讨与交流

系列地址:

QtExamples

欢迎 starfork 这个系列的 QT / DTK 学习,附学习由浅入深的目录。

QStyle之PenStyle的CustomDashLine使用相关推荐

  1. `QStyle`自定义重绘`QSlider`控件

    简介: 根据QStyle的继承关系和重绘原理:通过实现一个继承QCommonStyle类的实现,实现自己的自定义控件QSlider控件. 文章目录 本博文的简述or解决问题? 系列博文: 运行效果: ...

  2. 【Python 实战基础】Python 中 PyQt6 的 QPen 介绍

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 PyQt6 QPen 三.菜鸟实战 一.实战场景 实战场景:Python 中 PyQt6 的 QPen 介绍 二.主要知识点 文件读写 基础语法 ...

  3. QT的QStyle类的使用

    详细说明 QStyle类是一个抽象基类,它封装了GUI的外观. Qt包含一组QStyle子类,这些子类可模拟Qt支持的不同平台的样式(QWindowsStyle,QMacStyle等). 默认情况下, ...

  4. Qt的QStyle类的标准图标汇总

    Qt的QStyle类的标准图标用代码显示在界面如下: #include "QtWidgetsApplication1.h" #include<QPushButton> ...

  5. QStyle类用法总结(三)

    1.前言 为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章.说明如下: <QStyle类用法总结(一)>.该文是对Qt自定 ...

  6. QStyle/DTK重绘Qt-GUI已有控件,举例QScrollBar

    文章目录 编程环境: 背景: 查看 QScrollBar 的构成,如何查找源码? 解析绘画控件的步骤: 自定义风格完整代码如下: 项目分析: 源码下载: 系列文章: 简 述: 使用 QStyle / ...

  7. QStyle自定义重绘QScrollBar

    简介: QStyle自定义重绘QScrollBar(滚动条)样式. 文章目录 本博文的简述or解决问题? 运行效果: QScrollbar官方教程: QScrollbar属性理解: 系列地址: 本博文 ...

  8. QStyle类用法总结(二)

    1.前言 为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章.文章链接如下: <QStyle类用法总结(一)>.对Qt自定义 ...

  9. QStyle自定义重绘QRubberBand控件

    简介: 根据QStyle的继承关系和重绘原理:通过实现一个继承QCommonStyle类的实现,实现自己的自定义控件QRubberBand控件. 文章目录 本博文的简述or解决问题? 运行效果: QR ...

  10. 使用QStyle 高端定制弹出菜单 QPushButton源码剖析(一)

    这段时间研究了一下,qt的样式源码.同时也顺便自己做了一个样式.为了使大家能够看下去,先贴一贴效果. 以上效果,看似好像用qss采用setStyleSheet()的方式也可以更改:但结果证明是不行的, ...

最新文章

  1. 多台linux无密码访问之方法二
  2. python输出数据格式_这串数据有什么方法用python输出我想要的格式?
  3. idea中使用osgi_OSGi环境中的Servlet基本身份验证
  4. MySQL分页查询小技巧
  5. 英国莽汉司机认罪:放任特斯拉自动驾驶,自己躺在副驾悠哉悠哉
  6. Facebook内布拉斯加州数据中心将扩建100万平方英尺
  7. MATLAB通信仿真实例1:无噪声信道下DSB-SC调制解调器
  8. c语言设计一个酒店管理系统,C语言酒店管理系统设计.docx
  9. android6.0 power按键深入分析
  10. 编译原理实验三 自下而上语法分析
  11. python文件定位函数_C语言中文件定位函数总结
  12. Hinton NIPS2017 手写识别实现 TensorFlow \ Pytorch \ Keras
  13. 网易邮箱出现 FA_INVALID_SESSION
  14. [Mysql]查看mysql默认密码
  15. 自己打包部署iOS app分发
  16. 坐标变换 及矩阵变换
  17. Telelogic Tau 第二代
  18. ajax讲解和入门实例
  19. 飞瞳引擎™AI集装箱识别检测云服务,全球两千企业用户投入使用,集装箱信息识别率99.98%以上高泛化性,集装箱信息识别云服务免费
  20. csdn请勿使用默认标题是什么意思

热门文章

  1. 【笔记】用函数实现折半查找
  2. 数字人民币支付新选择 没有网络时也能使用
  3. 工业控制系统(ICS)部署图
  4. OllyDebug破解第一个 CM 程序 《Acid burn.exe》
  5. 小白学习HTML(一)——html基本格式
  6. 各种蔬菜水果中英文名称对照
  7. js返回浏览器的顶部
  8. 无线传感器网络作业题
  9. html中滚动速度怎么调节,html – 图像调整大小导致滚动速度慢
  10. 3D打印牛排,入口即化!你敢吃吗?