[oeasy]python0074_设置高亮色_color_highlight_ansi_控制终端颜色

更多颜色

回忆上次内容

  • 上次我们搞的还是颜色
    • FG foreground 前景色 30-37
    • BG background 背景色 40-47

图片描述

  • 这些 都可以和字体样式 结合起来

图片描述

  • 难道 就这几种颜色 吗??🤔
  • 有点啊!
  • 有些颜色 也和想象不一致
    • 金黄色 也不够啊?!

明确概念

  • \
    • 转义字符
    • escape character
  • \和其他字符
    • 可以构成转义序列
    • \t
    • \n
    • \r
  • \e 也是转义序列
    • \e 这个转义序列转义到 escape 这样的状态
    • 从正常的输出退出
    • 进入 control sequences 控制序列
  • 控制序列
    • 不直接输出到屏幕
    • 而是设置一些位置、样式、颜色之类的
    • 他开始于 CSI(Control Sequence Introduce)
  • CSI
    • \e 对应 ascii 的值是(033)<sub>8</sub>
    • \033[ 就是 控制序列初始化符号(Control Sequence Introduce)
    • 所以一般写作\033[控制信息
    • 如果我就想输出这个csi应该如何呢?

输出csi

  • 直接对\转义就可以

图片描述

  • 各厂商终端都开始学习VT100的控制序列
    • 关于控制信息的实现细节
    • 基本一致
    • 最终统一到了 ansi 标准下

图片描述

  • 于是终端有了色彩

亮色设置

  • 31-37 对应八种常见的前景色
  • 41-47 对应八种常见的背景色

图片描述

  • 91-97 对应八种高亮的常见前景色
  • 100-107对应 八种高亮的常见背景色

图片描述

尝试

图片描述

  • Bright Red和Red确实不一样

图片描述

  • Green也有区别
  • 高亮绿真的比原来更高亮啊!!😳

图片描述

  • 高亮蓝色确实让蓝色高亮了起来
  • 但是这个和字体样式中的加粗加亮比较呢?

具体实验

图片描述

  • 各种控制符
    • 31是普通红色
    • 91的高亮红色
    • 1是加粗字体
    • 31;1是普通红色加粗字体
  • 亮度排序
    • 最亮
      • 31;1
      • 91;1
    • 中亮
      • 91
    • 低亮
      • 31
  • 颜色 有点
    • 还不是 纯红色
  • 这个 颜色
    • 可以 更明确地量化 吗?

具体颜色

  • 高亮 只是 一个名称
    • 名称 可以 定义颜色
    • 也可以 定义高亮颜色
  • 但是
    • 究竟什么是 红?
    • 什么是 高亮红?
    • 这是一个 抽象的 颜色名
  • 具体的颜色 还是 由终端控制的
    • 这些终端 必须得落实到 颜色值
  • 每个终端 实现的红色
    • 都是 红的
    • 但 具体会有 一些差异

图片描述

  • 在这个 xfce的终端上
    • 就是想要 一个大红🟥啊!😫

目前颜色

  • 高亮红、红+亮
    • 都不够红😫

图片描述

  • 可以 再红😫些 么?

总结

  • 这次 了解了 高亮颜色
    • 91-97 是 高亮 前景色
    • 101-107是 高亮 背景色

图片描述

  • 颜色 种类
    • 在原来基础上 增加了一些
    • 但也非常有限
  • 还想要 更精细的颜色
    • 有可能吗??🤔
  • 我们下次再说!👋
  • 蓝桥->https://www.lanqiao.cn/courses/3584
  • github->https://github.com/overmind1980/oeasy-python-tutorial
  • gitee->https://gitee.com/overmind1980/oeasypython
  • 视频->https://www.bilibili.com/video/BV1CU4y1Z7gQ 作者:oeasy
<think>好的,我现在需要帮助用户解决一个使用C++生成垂直QSlider的问题,并且满足一系列具体的UI要求。首先,我需要明确用户的需求,然后逐步思考如何实现这些功能。 用户的需求包括: 1. 滑块图标使用SVG图片,大小为24x42。 2. 滑道宽度为7像素。 3. 滑动后滑道有高亮色覆盖。 4. 滑道左右绘制刻度,刻度显示可控制,并且间距可以自定义。 首先,我应该考虑使用Qt框架,因为QSlider是Qt的组件,适合自定义样式和功能。接下来,需要创建一个自定义的QSlider子类,重写paintEvent和其他必要的方法来实现这些功能。 关于SVG滑块图标,Qt的QIcon支持从SVG文件加载,所以可以在样式表中设置handle的image属性为SVG图片路径。不过可能需要调整QSlider的子控件rect,确保滑块的大小合适。 滑道宽度的设置可能需要通过样式表来调整,例如设置groove的height或width,但因为是垂直滑块,滑道的宽度应该对应样式表中的width属性。不过垂直QSlider的滑道通常是度为主,可能需要检查样式表的正确用法。 高亮色覆盖滑道的部分,可能需要使用样式表的subcontrol-position和background-color,或者通过绘制事件在滑块滑动后动态绘制高亮区域。这里可能需要计算滑块的位置,然后在滑道的相应部分绘制高亮色。 绘制刻度部分,需要在paintEvent中自定义绘制。左右两侧的刻度线,可以通过计算滑道的起始位置和长度,然后根据刻度数量和间距来绘制线条。用户希望控制刻度的显示和间距,所以应该添加相应的成员变量来控制这些参数,比如刻度线数量、间距、是否显示等。 接下来,考虑代码结构。需要创建一个继承自QSlider的类,重写paintEvent方法。在构造函数中设置垂直方向,并初始化相关变量,如刻度间距、颜色、是否显示等。在paintEvent中,首先调用基类的绘制方法,然后绘制高亮区域,接着绘制左右刻度。 关于高亮区域的计算,滑块的当前值对应的位置可以用sliderPosition()获取,然后根据滑道的rect来确定高亮区域的度。垂直滑块的滑道上部是最大值,下部是最小值,所以高亮部分可能是从底部到滑块当前位置,或者相反,需要根据方向调整。 绘制刻度时,需要遍历每个刻度位置,计算其在滑道左侧和右侧的位置,并绘制线条。间距的控制可能需要根据滑道的总度和刻度数量来计算步长,或者用户指定固定间距。这里用户希望间距可以自定义,所以可能需要添加一个成员变量来存储刻度与滑道的间距,比如m_tickMargin。 另外,样式的设置可能需要使用QStyleOptionSlider来获取滑道的rect和滑块的位置。在paintEvent中,先让默认的绘制处理滑块和滑道,然后再添加自定义的高亮和刻度。 测试代码部分,需要创建一个QApplication,设置样式表,加载SVG作为handle的图标,并调整滑道的宽度。可能需要使用setStyleSheet方法来设置groove和handle的样式,确保SVG图片正确显示,并且滑道宽度为7px。 可能的挑战包括正确计算高亮区域的位置和尺寸,确保刻度线与滑道的间距正确,以及处理不同DPI或缩放情况下的显示问题。此外,SVG图标的加载和缩放可能需要确保在24x42的大小下不失真。 最后,需要将所有代码整合,确保没有语法错误,并验证各个功能是否正常工作。可能需要测试滑块的拖动、高亮色的更新、刻度的显示与隐藏以及间距调整的效果。</think>以下是基于Qt框架实现的垂直QSlider自定义控件完整代码,包含您要求的所有功能特性: ```cpp #include <QSlider> #include <QPainter> #include <QSvgRenderer> #include <QStyleOptionSlider> class VerticalSlider : public QSlider { Q_OBJECT public: explicit VerticalSlider(QWidget* parent = nullptr) : QSlider(Qt::Vertical, parent) { setTickInterval(10); m_tickMargin = 5; // 刻度与滑道的默认间距 m_showTicks = true; m_grooveWidth = 7; } // 设置刻度可见性 void setTickVisibility(bool visible) { m_showTicks = visible; update(); } // 设置刻度间距 void setTickMargin(int margin) { m_tickMargin = margin; update(); } protected: void paintEvent(QPaintEvent* ev) override { QSlider::paintEvent(ev); QPainter p(this); QStyleOptionSlider opt; initStyleOption(&opt); // 绘制高亮滑道 drawHighlightGroove(p, opt); // 绘制刻度 if(m_showTicks) { drawTickMarks(p, opt); } } private: bool m_showTicks; int m_tickMargin; int m_grooveWidth; QColor m_highlightColor = QColor(255, 165, 0); // 高亮色 void drawHighlightGroove(QPainter& p, QStyleOptionSlider& opt) { // 计算高亮区域 QRect groove = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); QRect handle = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); int pos = sliderPosition(); int range = maximum() - minimum(); int span = (groove.height() - handle.height()) * pos / range; // 绘制高亮背景 p.setPen(Qt::NoPen); p.setBrush(m_highlightColor); p.drawRect(groove.left(), groove.bottom() - span, m_grooveWidth, span); } void drawTickMarks(QPainter& p, QStyleOptionSlider& opt) { QRect groove = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this); int tickLength = 4; p.setPen(palette().dark().color()); for(int i = minimum(); i <= maximum(); i += tickInterval()) { int yPos = QStyle::sliderPositionFromValue(minimum(), maximum(), i, groove.height()); // 左侧刻度 p.drawLine(groove.left() - m_tickMargin - tickLength, yPos, groove.left() - m_tickMargin, yPos); // 右侧刻度 p.drawLine(groove.right() + m_tickMargin, yPos, groove.right() + m_tickMargin + tickLength, yPos); } } }; // 使用示例 int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget window; QVBoxLayout layout(&window); VerticalSlider slider; slider.setFixedSize(60, 300); slider.setTickMargin(10); // 设置刻度间距 slider.setTickVisibility(true); // 设置样式 slider.setStyleSheet(R"( QSlider::groove:vertical { background: #DDD; width: 7px; /* 滑道宽度 */ border-radius: 3px; } QSlider::handle:vertical { image: url(:/slider_handle.svg); /* SVG图标路径 */ width: 24px; height: 42px; margin: -10px 0; /* 扩大点击区域 */ } )"); layout.addWidget(&slider); window.show(); return a.exec(); } ``` 关键实现说明: 1. **自定义绘制系统**: - 继承QSlider并重写paintEvent - 使用QStyleOptionSlider获取控件几何信息 - 分三部分绘制:默认控件、高亮滑道、刻度线 2. **高亮滑道实现**: - 根据滑块位置计算高亮区域 - 使用橙色作为高亮色(可自定义) - 动态更新高亮区域 3. **刻度系统**: - 左右对称刻度线绘制 - 可控制刻度间距(m_tickMargin) - 通过setTickVisibility控制显隐 4. **样式定制**: - 使用CSS设置滑道宽度和手柄图标 - SVG图标通过CSS的image属性加载 - 手柄尺寸严格设置为24x42像素 使用注意事项: 1. 需要QtSvg模块支持SVG图标 2. 刻度间距和颜色可通过成员函数调整 3. 高亮色通过修改m_highlightColor改变 4. 需提供正确的SVG图标路径 建议配合资源文件(qrc)管理SVG图标,确保在不同分辨率下清晰显示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值