QStyle类用法总结(一)

Qt Model/View 学习(6) - Delegate教程之——渲染 Delegate:该来的总是要来的…… 阅读详情
AI摘要

本文介绍Qt自定义风格的实现方法,包括设置应用级和组件级风格、开发自适应风格的自定义组件、创建和使用自定义风格等。并提供代码示例说明如何重写QStyle类实现特定风格。

目录

1.前言

2 详述

2.1 设置风格

2.2 开发自适应风格的自定义窗体

2.3 创建自定义风格

2.4 如何使用自定义风格

2.5  View中item风格


1.前言

 QT自绘技术系列文章链接如下: 

  1.  《QStyle类用法总结(一)》。对Qt自定义风格简单描述,对QStyle及其相关类作了概念性的描述。
  2. 《QStyle类用法总结(二)》。对QStyle及其相关类作了详细描述。
  3. 《QStyle类用法总结(三)》。对QStyle中的各widget元素的层次继承树做了详细描述。
  4. 《QProxyStyle用法简述》。通过一个简单的例子,演示了QProxyStyle类用法。
  5. 《QStyle实现自绘界面项目实战(一)》通过项目实战来理解前几篇提到的内容,理解QStyle及其子类在自绘时的工作机制。
  6. 《QStyle实现自绘界面项目实战(二)》通过项目实战来理解前几篇提到的内容,理解QStyle及其子类在自绘时的工作机制。

2 详述

       Qt包含一套QStyle子类集合。这些QStyle子类尽可能地实现Qt以支持不同的操作系统平台,例如:QWindowsStyle, QMacStyle 等等。默认地,这些QStyle子类被内建到Qt的GUI模块中了。各种风格也可以通过Qt插件的形式得以访问和利用。

      Qt内建的各种widgets用QStyle类执行近乎所有关于这些widgets的绘制工作,以保证这些widgets看起来非常和它们所处的操作系统平台所在的风格一样。下面这张图显示QComboBox 在9种不同操作系统平台下的风格:

2.1 设置风格

        整个应用程序风格能够通过QApplication::setStyle() 函数进行设置。它也能够被用户通过

-style命令行指定,如下面那样:

./myapplication -style windows

        如果没有风格被指定,Qt将会用最接近你所在操作系统平台或桌面环境的风格来渲染你的应用程序外观。

        通过 QWidget::setStyle()函数,你可以为每个QWidget窗体部件指定单独风格。

2.2 开发自适应风格的自定义窗体

     如果你想开发自定义的widgets且它们在所有的平台上看起来外观效果都非常好,那么你应该用QStyle类的相关函数去执行窗体部分区域的绘制,像:drawItemText(), drawItemPixmap(), drawPrimitive(), drawControl(), and drawComplexControl()函数。

大部分QStyle类的绘制函数接受4个参数:

  1. 一个枚举值,该枚举值指定哪种类型的图形元素被绘制。
  2. 一个QStyleOption 类型参数。该参数指示怎么绘制、在哪个地方绘制条目1中提到的图形元素。
  3. 一个QPainter类型参数。该参数被用来绘制条目1中提到的图形元素。
  4. 一个QWidget类型参数。该参数是可选的。绘制过程在该参数表示的widget上执行。

例如:如果你想在你的widget上绘制一个具有焦点的矩形,你可以像下面那样:

  void MyWidget::paintEvent(QPaintEvent * /* event */)
  {
      QPainter painter(this);

      QStyleOptionFocusRect option;
      option.initFrom(this);
      option.backgroundColor = palette().color(QPalette::Background);

      style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);
  }

在上面代码中,QStyle类从QStyleOption类型参数中得到需要绘制元素的所有信息。一个widget对象作为最后一个参数被传入函数。在这种情况下,QStyle类可以在传入的widget对象执行一些特殊效果(如:实现mac操作系统上的按钮动画),但这个widget对象不是必要的。事实上,你可以用QStyle在任何绘图设备上进行绘制,不仅仅是widget。

       QStyleOption有很多子类,如:    

QStyleOptionButton, 
QStyleOptionComplex, 
QStyleOptionDockWidget, 
QStyleOptionFocusRect, 
QStyleOptionFrame, 
QStyleOptionGraphicsItem, 
QStyleOptionHeader, 
QStyleOptionMenuItem, 
QStyleOptionProgressBar, 
QStyleOptionRubberBand, 
QStyleOptionTab, 
QStyleOptionTabBarBase, 
QStyleOptionTabWidgetFrame, 
QStyleOptionToolBar, 
QStyleOptionToolBox, 
QStyleOptionViewItem。

   这些子类对应被绘制的图形元素,例如:PE_FrameFocusRect(表示QStyle类下获得焦点的指示器)就对应于表示具有焦点风格的QStyleOptionFocusRect参数。

           为保证绘制效率尽可能快,QStyleOption及其子类采用公用数据成员。出于方便,Qt提供QStylePainter类,该类组合了QStyle、QPainter、QWidget类。这使得可以保证在实现相同功能的情况下,使得下面代码:


      QStylePainter painter(this);
      ...
      painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);

取代下面的:


      QPainter painter(this);
      ...
      style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);

2.3 创建自定义风格

       可以为自己的应用程序创建自定义风格和外观。有两种方法可以创建自定义的风格:一种是静态方法,另外一种是动态方法。当用静态方法创建自定义风格时,要么选择一个Qt 已有风格类作为基类,然后从这个基类中派生自己的风格类,然后重载基类虚函数,从而实现自己要想的行为和外观;或者你可以重载实现QStyle类的虚函数。在动态方法中,你可以在应用程序运行时修改、变更应用程序外观。

       静态创建自定义风格的第一步是从Qt已提供的风格基类中选择一中符合、满足自己风格类作为基类。你选择何种Qt已提供的风格类作为实现自己风格类的基类,取决于该基类是否最大化地满足你的风格需求。通常,我们选择Qt已有的QCommonStyle作为自定义风格类的基类,而不是QStyle作为基类。

      根据想要改变基类的哪些风格,必须重写那些被用来绘制的部分接口。为了阐述这,我们将把Spin Box的上下箭头的风格改为QWindowsStyle风格(即在windows下的风格)。Spin Box的上下箭头是一个primitive elements。它是drawPrimitive()函数绘制而成的,所以我们需要重写这个函数。我们需要一个下面的类的声明:

  class CustomStyle : public QProxyStyle
  {
      Q_OBJECT

  public:
      CustomStyle();
      ~CustomStyle() {}

      void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                         QPainter *painter, const QWidget *widget) const override;
  };

为实现绘制上下箭头,QSpinBox 用 PE_IndicatorSpinUp 和 PE_IndicatorSpinDown表示上下箭头。下面代码实现绘制上下箭头的drawPrimitive函数的重写,从而实现自己想要的箭头的样式:


  void CustomStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                                  QPainter *painter, const QWidget *widget) const
  {
       // 如果要绘制的窗体元素是上下箭头
      if (element == PE_IndicatorSpinUp || element == PE_IndicatorSpinDown) 
       {
          QPolygon points(3);

          // option->rect()表示上下箭头占据的最小外包围矩形
          int x = option->rect.x();
          int y = option->rect.y();
          int w = option->rect.width() / 2;
          int h = option->rect.height() / 2;
          x += (option->rect.width() - w) / 2;
          y += (option->rect.height() - h) / 2;

          // 如果是上箭头
          if (element == PE_IndicatorSpinUp) 
           {
              // 将箭头左端点绘制在矩形的左边框向下高度一半的地方。
              points[0] = QPoint(x, y + h);  
 
               // 将箭头右端点绘制在左端点向右w处,和左端点高度一致的地方。
              points[1] = QPoint(x + w, y + h);

              // 将箭头上端点绘制在左端点和右端点之间且比左右端点朝上h的地方
              points[2] = QPoint(x + w / 2, y);
          } 
         else   // 如果是下箭头
            { // PE_SpinBoxDown
   
            // 将左端点绘制在矩形左上顶点处
              points[0] = QPoint(x, y);

              // 将右端点绘制在和左端点同一高度,但比左端点向右w即矩形宽度的1/2处
              points[1] = QPoint(x + w, y);

              // 将箭头下端点绘制在左右端点的中间且朝下为矩形高度的一半处
              points[2] = QPoint(x + w / 2, y + h);
          }

          // 当QSpinBox可用和不可用时,用不同的画笔、画刷绘制,以展示可用或不可用的状态
          if (option->state & State_Enabled) {
              painter->setPen(option->palette.mid().color());
              painter->setBrush(option->palette.buttonText());
          } else {
              painter->setPen(option->palette.buttonText().color());
              painter->setBrush(option->palette.mid());
          }

          // 绘制三角形,从而形成了视觉上的箭头
          painter->drawPolygon(points);
      } 

     else  // 非上下箭头部件,则直接调用基类的
    {
      QProxyStyle::drawPrimitive(element, option, painter, widget);
      }
  }

上面代码绘制出的pin box的箭头效果类似如下:

      上面代码中,并没有用到widget参数。前面提到:绘制需要的信息及如何绘制都在QStyleOption参数对象中指定了,所以上面代码不需要widget参数。如果需要用widget参数获取一些绘制的附加信息,请注意在使用widget参数之前确保该参数对象不为nullptr且是正确的控件类型。例如:

  const QSpinBox *spinBox = qobject_cast<const QSpinBox *>(widget);
      if (spinBox) {
      ...
      }

      上面代码,当实现一个自定义风格类型时,不能因为被绘制元素类型是PE_IndicatorSpinUp 或 PE_IndicatorSpinDown就认为widget参数就是一个QSpinBox类型。

注意:Qt样式表在自定义QStyle子类中当前不被支持,即自定义风格和Qt 样式表只能选其一。Qt 官方计划在Qt未来版本中,实现自定义风格中支持样式表。

       Qt 官方自带的例子styles(存放在Qt安装目录下的Examples\Qt-X.XX.XX\widgets\widgets\styles, 其中Qt-X.XX.XX为Qt的版本号,如:Qt-5.14.1)和affine(存放在Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\painting\affine, 其中Qt-X.XX.XX为Qt的版本号,如:Qt-5.14.1)展示了如何自定义自己风格实现GUI的绘制。参见博文

《QStyle实现自绘界面项目实战(一)》

2.4 如何使用自定义风格

      在Qt应用程序中,有多种使用自定义风格的方法。最简单的一种方法是:当创建QApplication对象之前,传递自定风格到QApplication::setStyle() 静态函数:


  #include <QtWidgets>

  #include "customstyle.h"

  int main(int argc, char *argv[])
  {
      QApplication::setStyle(new CustomStyle);
      QApplication app(argc, argv);
      QSpinBox spinBox;
      spinBox.show();
      return app.exec();
  }

       能在创建QApplication对象之前的任何时候调用QApplication::setStyle() 从而设置自定义风格。为了保证、确信自定义风格是否是自己想要的或想提前预览下自定义风格,可以用如下命令行提前测试下:

./myapplication -style custom

其中myapplication是应用程序可执行文件名,cusom是自定义风格类。假如应用程序名为a,自定义风格类是前面提到的CustomStyle,则可以利用windows下的命令行或linux终端,利用如下命令行进行预览CustomStyle风格效果。

./a -style CustomStyle

2.5  View中item风格

        Model/View框架中有item,如:QTableWidgetItem、QStandardItem、QTreeWidgetItem等,这些项是被代理绘制的。Qt默认代理类是 QStyledItemDelegate。默认代理类被用来计算项的外包围矩形和对项赋予各种数据角色(如:Qt::DisplayRole、Qt::EditRole等,参见Qt::ItemDataRole枚举)。关于 QStyledItemDelegate的更多详细说明和用法,请参见Qt Assistant 。

       当Qt用默认代理类QStyledItemDelegate绘制view中的item时,它绘制CE_ItemViewItem(该枚举值表示view内部的item)且用 CT_ItemViewItem枚举值计算这些item占据区域的尺寸大小,用SE_ItemViewItemText枚举值设置item中文本占据的区域的尺寸大小。当实现一个自定义风格绘制views、item时,需要检测QCommonStyle (和从其它风格继承来的子类)的实现。这样就可以找出是哪一个风格且该风格是怎么样被绘制的,然后重写绘制部件元素的函数,以保证绘制是不同的,从而满足自己的风格需求。如下为一个自定义的绘制view中的item中背景色的例子:

   switch (element) {
          case (PE_PanelItemViewItem): {
              painter->save();

              QPoint topLeft = option->rect.topLeft();
              QPoint bottomRight = option->rect.topRight();
              QLinearGradient backgroundGradient(topLeft, bottomRight);
              backgroundGradient.setColorAt(0.0, QColor(Qt::yellow).lighter(190));
              backgroundGradient.setColorAt(1.0, Qt::white);
              painter->fillRect(option->rect, QBrush(backgroundGradient));

              painter->restore();
          break;
          }
          default:
              QProxyStyle::drawPrimitive(element, option, painter, widget);
      }

其中PE_PanelItemViewItem表示绘制view中item的背景色,当QCommonStyle类在实现CE_ItemViewItem即view中的item时,PE_PanelItemViewItem即item的背景色就会被调用。

为了添加对新数据类型和item新数据角色的支持,需要创建一个自定义代理类,如果仅仅是需要支持默认代理数据类型,此时就不需要创建自定义的风格,因为默认代理都提供了。关于如何自定义代理类,请参见Qt Assistant中对 QStyledItemDelegate的描述。

view列头风格也可以自定义,可以对view列头tem的尺寸大小和行列大小通过自定义风格进行控制。

QT界面美化之QStyle  转贴: http://www.cppblog.com/umbcom/QT中的QStyle类提供了对QT应用程序界面的封装,QT本身也是利用它应对不同平台下的界面外观的。例如 在windowxp下 你所写的程序的默认外观是通过QT自身调用QWindowsXPStyle来实现的.既然它提供了这么方便的类用来绘制独立于应用程序功能框架的程序外观,那想对自己程序的界面进行美化人,你确实很有必要去 阅读详情

相关推荐

使用QStylePainter类实现Qt界面的绘制

在Qt中,我们可以使用QStylePainter类来对UI控件进行自定义绘制,从而满足特定的需求。QStylePainter类是一个方便的工具类,它封装了QStyle类中的一些功能,使得我们可以轻松地实现各种自定义UI效果。如果想要实现其他类型的UI效果,可以查看Qt文档中的QStyle::PrimitiveElement枚举值,或者通过QStyleOption类来设置不同的选项参数。为了演示自定义UI绘制效果,我们需要创建一个自定义控件,可以选择QLabel或QPushButton控件。

techDM的博客 400

Qt之模型/视图(自定义按钮)

简述 衍伸前面的章节,我们对QTableView实现了数据显示、自定义排序、显示复选框、进度条等功能的实现,本节主要针对自定义按钮进行讲解,这节过后,也希望大家对自定义有更深入的了解,在以后的功能开发过程中,相信无论遇到什么样式形式,我们都可以很好地实现。 简述 效果 QStyledItemDelegate 源码 衍伸...

weixin_34356310的博客 1049

QT的QStylePainter类的使用

在上面的示例中,我们使用drawControl()函数来绘制不同类型的GUI元素。在上面的示例中,我们创建了一个继承自QWidget的自定义小部件MyWidget,并在其paintEvent()函数中使用QStylePainter来绘制一个按钮元素。您可以根据自己的需求设置绘制元素的样式,并使用适当的绘制函数来实现绘制。在上面的示例中,我们在一个继承自QWidget的自定义小部件中的paintEvent()函数中创建了一个QStylePainter对象。QT的QStylePainter类的使用。

JieLun_C的博客 398

QStyleOptionViewItem类详细介绍

python。

wanglaqqqq的博客 748

QT的QStyle类的使用

详细说明 QStyle类是一个抽象基类,它封装了GUI的外观。 Qt包含一组QStyle子类,这些子类可模拟Qt支持的不同平台的样式(QWindowsStyle,QMacStyle等)。 默认情况下,这些样式内置在Qt GUI模块中。 样式也可以作为插件使用。 Qt的内置窗口小部件使用QStyle来执行几乎所有的绘图,从而确保它们看起来完全等同于等效的本机窗口小部件。 下图显示了九种不同样式的QComboBox。 主题: 设定风格 可以使用QApplication :: setStyle()函数设置整个应

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2121

EDA虚拟机分享2020版本(Synopsys2020)

EDA虚拟机分享

亦安的数字小站 9189

QStyle类用法总结(二)

QStyle类用法总结(二)

danshiming的博客 5150

python-pptx库中文文档及使用样例

个人使用样例及部分翻译自官方文档,并详细介绍chart的使用

4万+

QStyle类用法总结(三)

自定义style、图形元素层次树

danshiming的博客 3833

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 97

短信验证码逻辑漏洞学习——各种绕过姿势技巧

短信验证码逻辑漏洞学习——各种绕过姿势技巧

记录并分享学习安全的知识点.. 2556

QStyle类参考

QStyle类参考 QStyle类是一个封装了GUI外观感觉的抽象基类。 使用中:#include 继承自QObject。 被QCommonStyle继承。 详细描述        QStyle类是封装了GUI外观感觉的抽象基类。        Qt包含了一系列QStyle的子类,枚举了Qt支持不同平台的样式(例如:QWindowsStyle,QMacStyle,QMo

chenlong12580的专栏 1万+

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1431

QStyle

一、描述 QStyle 类是一个抽象基类,它封装了 GUI 的外观。样式也可以作为插件使用。 Qt 的内置小部件使用 QStyle 来执行几乎所有的绘图,确保它们看起来与等效的原生小部件完全一样。下图显示了九种不同样式的 QComboBox。 1.1、设置样式 可以使用 QApplication::setStyle() 函数设置整个应用程序的样式。 如果没有指定样式,Qt 会为用户的平台或桌面环境选择最合适的样式。 也可以使用 QWidget::setStyle() 函数在单个小部件上设置样

友善啊,朋友的博客 4040

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2510

DeepSeek在实时计算与流处理系统中的突破性实践

对于技术决策者而言,现在正是将DeepSeek实时计算技术纳入企业架构蓝图的关键时机,那些能够率先构建实时智能能力的企业,将在数据驱动的商业竞争中赢得决定性优势。DeepSeek通过创新的流处理架构,成功将复杂事件处理(CEP)的延迟降低到亚秒级,同时保证了计算结果的精确性。DeepSeek研发的神经架构搜索(NAS)与知识蒸馏联合优化框架,可在保持模型精度的前提下,将参数量压缩至原始模型的1/100,实现边缘设备的实时AI推理。随着5G和物联网技术的普及,对实时处理能力的需求将呈指数级增长。

Programming Talk 290

Qt QStyle详解

QStyle类是 Qt 框架中用于控制应用程序界面元素外观的一个抽象基类。这个类提供了一种方式来定制窗口部件(widgets)的绘制和行为,可以通过改变主题或风格来更改应用程序的外观,而无需修改窗口部件本身的代码。Qt包含一组QStyle子类,这些子类模仿Qt支持的不同平台的样式(QWindowsStyle、QMacStyle等)。默认情况下,这些样式内置在Qt GUI模块中。样式也可以作为插件提供。Qt的内置widget使用QStyle来执行几乎所有的绘制,确保它们看起来与等效的本地小部件完全相同。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 4851

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 786

Qt QStyle

QStyle Class QStyle类是一个抽象基类,它封装了GUI的外观。 Qt 包含一组 QStyle 子类,这些子类可以模拟Qt支持不同的平台样式(QWindowsStyle,QMacStyle等)。默认情况下,这些样式内置在 Qt GUI 模块中,样式也可以作为插件使用。 Qt 的内置小窗口部件使用 QStyle 来执行几乎所有的绘图,从而确保它们看起来完全等同于等效的本级窗口小部件。下图展示了九中不同样式的 QCombox。 Setting a Style (设定风格) 可以使用 QAppli

暖暖_的_纠结的博客 6269

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

QStyle文档

QStyle文档

随手写下笔记和感悟 1226

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

QStyle简介

QStyle类的内容非常庞大,本文旨在对各部分一句话概括,方便建立整体认知。更详细全面的内容另请参见QStyle文档。

随手写下笔记和感悟 932

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

QT中QStyle的使用

QStyle介绍:   Qt是一个跨平台的类库,相同的界面组件在不同的操作系统上显示效果是不一样的,QStyle封装了GUI界面组件外观的抽 象类,QT内置的界面组件都使用QStyle进行绘制,以保证他们与运行平台的界面效果一致。 运行结果图: 一.相关类和函数介绍: QStyleFactory类管理着Qt的内置样式。 QStringList QStyleFactory::keys():返回平台支持的QStyle的名称列表 QStyle *QStyleFactory::create(const QStr

Vivi的城 9858

QStyle实现自绘界面项目实战(一)

通过项目实战来理解前几篇提到的内容

danshiming的博客 3195

Qt的QStyle类的标准图标汇总

Qt的QStyle类的标准图标用代码显示在界面如下: #include "QtWidgetsApplication1.h" #include<QPushButton> #include<QStyle> #include <QGridLayout> QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent) : QWidget(parent) { ui.setupUi(this);

danshiming的博客 4509

Qt - QStyle类用法总结

Qt - QStyle类用法总结

weixin_45079970的博客 1122

QStyle类&&委托

基础类的介绍: //以下三个函数在装载Style和卸载Style时调用,它可以是适当修改窗口部件和调色板 void polish(QPalette &palette); void polish(QWidget *widget); void unpolish(QWidget *widget); //设置各部件的线宽,大小等 int pixelMetric(PixelMetric m

@奮 鬥@的专栏 3280
上一篇: QWidget的parentWidget、window、nativeParentWidget区别与理解
下一篇: QStyle类用法总结(二)
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值