Qt:玩转QPainter序列四

news2024/11/15 13:34:23

前言

接着干源码

正文

先看源码,然后我们逐条分析
在这里插入图片描述
QPainter 是一个强大的绘图类,用于在 QWidgetQImageQPixmap 等设备上进行绘图操作。下面我会详细解释你提到的各个函数和属性,并通过示例展示它们的用法。

1. font()setFont()

  • const QFont &font() const;
    返回当前使用的字体,第一个const不允许别人修改它,第二个const表示它不修改别人。
  • void setFont(const QFont &f);
    设置绘图使用的字体。
    看到这里我们简单看下QFont构造函数。
    在这里插入图片描述
    QFont 类用于描述字体的属性,如字体家族、字号、字重、斜体等。第一个是默认构造就不说了。
1.1 QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false);
  • 构造函数
    使用指定的字体家族、字号、字重和斜体属性创建一个 QFont 对象。

    参数:

    • family: 字符串类型,指定字体的家族名称,如 "Arial""Times New Roman" 等。
    • pointSize: 整数类型,指定字体的点大小。如果设置为 -1,则使用系统默认大小。
    • weight: 整数类型,指定字体的字重,范围为 099,也可以使用预定义的值如 QFont::NormalQFont::Bold。如果设置为 -1,则使用默认字重。
    • italic: 布尔类型,指定字体是否为斜体。默认为 false(非斜体)。
    QFont customFont("Arial", 12, QFont::Bold, true);
    
1.2 QFont(const QFont &font, QPaintDevice *pd); (仅在 Qt 5.x 版本可用)
  • 拷贝构造函数
    在指定的 QPaintDevice 上创建一个与现有 QFont 对象相同的字体。

    参数:

    • font: QFont 类型,作为模板的现有字体对象。
    • pd: 指向 QPaintDevice 的指针,指定要应用字体的设备。QPaintDevice 是一个抽象基类,QWidgetQPixmap 等都继承自它。
    QPaintDevice *device = ...;  // 假设这是一个有效的 QPaintDevice 指针
    QFont font("Arial", 12);
    QFont newFont(font, device);
    
1.3 QFont(const QFont &font, const QPaintDevice *pd);
  • 拷贝构造函数 (Qt 6.0及以上版本)
    在指定的 QPaintDevice 上创建一个与现有 QFont 对象相同的字体。

    参数:

    • font: QFont 类型,作为模板的现有字体对象。
    • pd: 指向 QPaintDevice 的常量指针,指定要应用字体的设备。

    这个构造函数与之前的版本类似,只是 pd 参数变为常量指针,以适应 Qt 6.0 及以上版本的接口变化。

1.4 QFont(const QFont &font);

  • 拷贝构造函数
    使用现有的 QFont 对象创建一个新的 QFont 对象。

    参数:

    • font: QFont 类型,作为模板的现有字体对象。
    QFont originalFont("Arial", 12);
    QFont copiedFont(originalFont);
    
示例:

在这里插入图片描述

2. fontMetrics()fontInfo()

  • QFontMetrics fontMetrics() const;
    返回当前字体的 QFontMetrics 对象,用于获取字体的度量信息(如文本的宽度和高度)。多用于处理文本布局。这种对象多半不能直接转换成字符串,需要借助该对象来访问该对对象的属性
  • QFontInfo fontInfo() const;
    返回当前字体的 QFontInfo 对象,用于获取字体的详细信息。这种对象多半不能直接转换成字符串,需要借助该对象来访问该对对象的属性
示例:
QPainter painter(this);
QFont font("Arial", 16);
painter.setFont(font);
QFontMetrics metrics = painter.fontMetrics();
int textWidth = metrics.horizontalAdvance("Hello, QPainter!");
painter.drawText(50, 50, "Hello, QPainter!");

3. setPen()pen()

  • void setPen(const QColor &color);
    使用指定的颜色设置画笔。
  • void setPen(const QPen &pen);
    使用指定的 QPen 对象设置画笔。
  • void setPen(Qt::PenStyle style);
    设置画笔的样式。
  • const QPen &pen() const;
    返回当前的画笔。
    简单看一下QPen这个类
    在这里插入图片描述
    QPen 类在 Qt 中用于定义如何绘制线条和边框,包括颜色、宽度、样式等属性。
QPen 构造函数详解
  1. QPen()

    • 解释: 默认构造函数,创建一个默认的 QPen 对象,通常为黑色、实线、宽度为 1 像素。
  2. QPen(Qt::PenStyle)

    • 解释: 这个构造函数允许通过指定线条样式来创建 QPen 对象,例如 Qt::SolidLineQt::DashLine 等。
    • 参数:
      • Qt::PenStyle: 线条的样式,例如实线、虚线等。
  3. QPen(const QColor &color)

    • 解释: 使用指定颜色创建 QPen 对象,其他属性使用默认值。
    • 参数:
      • const QColor &color: 线条的颜色。
  4. QPen(const QBrush &brush, qreal width, Qt::PenStyle s = Qt::SolidLine, Qt::PenCapStyle c = Qt::SquareCap, Qt::PenJoinStyle j = Qt::BevelJoin)

    • 解释: 这个构造函数允许指定更详细的线条属性,如使用 QBrush 设置的笔刷、线条宽度、样式、端点样式和连接样式。这个最常用,但是要注意这里的QBrush并不是填充图形样式而是改变外部线条的样式
    • 参数:
      • const QBrush &brush: 用于绘制线条的笔刷。
      • qreal width: 线条的宽度。
      • Qt::PenStyle s: 线条样式,默认为实线。
      • Qt::PenCapStyle c: 线条端点的样式,如方形端点、圆形端点等。
      • Qt::PenJoinStyle j: 线条连接处的样式,如斜角连接、圆角连接等。
  5. QPen(const QPen &pen) noexcept

    • 解释: 拷贝构造函数,用于创建一个新的 QPen 对象,该对象是另一个 QPen 对象的副本。
    • 参数:
      • const QPen &pen: 用于复制的 QPen 对象。
  6. QPen &operator=(const QPen &pen) noexcept

    • 解释: 拷贝赋值运算符,用于将一个 QPen 对象的值赋给另一个 QPen 对象。
    • 参数:
      • const QPen &pen: 被赋值的 QPen 对象。
  7. QPen(QPen &&other) noexcept

    • 解释: 移动构造函数,用于高效地转移 QPen 对象的资源。通过这个构造函数,可以避免不必要的内存复制。
    • 参数:
      • QPen &&other: 被移动的 QPen 对象。
  8. QPen &operator=(QPen &&other) noexcept

    • 解释: 移动赋值运算符,将另一个 QPen 对象的资源转移给当前对象。
    • 参数:
      • QPen &&other: 被移动的 QPen 对象。
noexcept 的作用

noexcept 是 C++11 引入的一个关键字,用于指明函数在执行过程中不会抛出异常。如果一个函数声明为 noexcept,编译器可以对该函数进行优化,因为它知道调用该函数不会触发异常机制。

示例一:
void PlayQPainter::initcboPenStyle()
{
    //为画笔样式添加条目
    ui->cboPenStyle->addItem("Solid",static_cast<int>(Qt::SolidLine));
    ui->cboPenStyle->addItem("Dash",static_cast<int>(Qt::DashLine));
    ui->cboPenStyle->addItem("Dot",static_cast<int>(Qt::DotLine));
    ui->cboPenStyle->addItem("Dash Dot",static_cast<int>(Qt::DashDotLine));
    ui->cboPenStyle->addItem("Dash Dot Dot",static_cast<int>(Qt::DashDotDotLine));
    ui->cboPenStyle->addItem("None",static_cast<int>(Qt::NoPen));

    //连接信号与槽
    connect(ui->cboPenStyle,QOverload<int>::of(&QComboBox::currentIndexChanged), this, [this](){
        int index = ui->cboPenStyle->currentIndex();
        Qt::PenStyle style = (Qt::PenStyle)ui->cboPenStyle->itemData(index).toInt();
        ui->paintArea->setPenStyle(style);
    });
}


void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    QPen pen;
    pen.setWidth(20);
    pen.setColor(Qt::green);
    pen.setStyle(m_penStyle);
    painter.setPen(pen);
    painter.drawRect(50,50,300,300);

}

在这里插入图片描述

在这里插入图片描述

示例二:
void PlayQPainter::initcboLineBrush()
{
    //添加所有的Qt::BrushStyle
    ui->cboLineBrush->addItem("NoBrush",static_cast<int>(Qt::NoBrush));
    ui->cboLineBrush->addItem("Solid",static_cast<int>(Qt::SolidPattern));
    ui->cboLineBrush->addItem("Dense1",static_cast<int>(Qt::Dense1Pattern));
    ui->cboLineBrush->addItem("Dense2",static_cast<int>(Qt::Dense2Pattern));
    ui->cboLineBrush->addItem("Dense3",static_cast<int>(Qt::Dense3Pattern));
    ui->cboLineBrush->addItem("Dense4",static_cast<int>(Qt::Dense4Pattern));
    ui->cboLineBrush->addItem("Dense5",static_cast<int>(Qt::Dense5Pattern));
    ui->cboLineBrush->addItem("Dense6",static_cast<int>(Qt::Dense6Pattern));
    ui->cboLineBrush->addItem("Dense7",static_cast<int>(Qt::Dense7Pattern));
    ui->cboLineBrush->addItem("Horizontal",static_cast<int>(Qt::HorPattern));
    ui->cboLineBrush->addItem("Vertical",static_cast<int>(Qt::VerPattern));
    ui->cboLineBrush->addItem("Cross",static_cast<int>(Qt::CrossPattern));
    ui->cboLineBrush->addItem("Backward Diagonal",static_cast<int>(Qt::BDiagPattern));
    ui->cboLineBrush->addItem("Forward Diagonal",static_cast<int>(Qt::FDiagPattern));
    ui->cboLineBrush->addItem("Diagonal Cross",static_cast<int>(Qt::DiagCrossPattern));
    ui->cboLineBrush->addItem("Linear Gradient",static_cast<int>(Qt::LinearGradientPattern));
    ui->cboLineBrush->addItem("Radial Gradient",static_cast<int>(Qt::RadialGradientPattern));
    ui->cboLineBrush->addItem("Conical Gradient",static_cast<int>(Qt::ConicalGradientPattern));
    ui->cboLineBrush->addItem("Texture",static_cast<int>(Qt::TexturePattern));

    //连接信号与槽
    connect(ui->cboLineBrush,QOverload<int>::of(&QComboBox::currentIndexChanged), this, [this](){
        int index = ui->cboLineBrush->currentIndex();
        Qt::BrushStyle style = (Qt::BrushStyle)ui->cboLineBrush->itemData(index).toInt();
        ui->paintArea->setLineBrush(style);
    });
}


void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    QBrush brush(Qt::green, m_lineBrushStyle);
    painter.setPen(QPen(brush,40));
    painter.drawRect(100,100,200,200);

}

在这里插入图片描述
在这里插入图片描述

4. setBrush()brush()

  • void setBrush(const QBrush &brush);
    使用指定的 QBrush 对象设置画刷。
  • void setBrush(Qt::BrushStyle style);
    设置画刷的样式。
  • const QBrush &brush() const;
    返回当前的画刷。

简单看一下QBrush
在这里插入图片描述
QBrush 是 Qt 中用于描述填充模式的类,可以填充颜色、渐变、图案或纹理。

4.1 QBrush 的构造函数

QBrush 提供了多种构造函数,用于初始化不同类型的画刷:

  • QBrush()

    • 功能:默认构造函数,创建一个未初始化的画刷,通常情况下表示没有填充。
    • 示例
      QBrush brush;
      
  • QBrush(Qt::BrushStyle style)

    • 功能:使用指定的画刷样式(如纯色、斜线、点状填充等)构造一个画刷。默认颜色为黑色。
    • 参数
      • styleQt::BrushStyle 枚举类型,表示画刷的样式。
    • 示例
      QBrush brush(Qt::DiagCrossPattern); // 斜十字图案
      
  • QBrush(const QColor &color, Qt::BrushStyle style = Qt::SolidPattern)

    • 功能:使用指定的颜色和画刷样式构造一个画刷。
    • 参数
      • colorQColor 对象,表示画刷的颜色。
      • styleQt::BrushStyle,指定画刷的样式,默认为 Qt::SolidPattern(实心填充)。
    • 示例
      QBrush brush(Qt::red, Qt::Dense5Pattern); // 红色和密集图案5
      
  • QBrush(const QPixmap &pixmap)

    • 功能:使用指定的图像 (QPixmap) 构造一个画刷,用于图案填充。
    • 参数
      • pixmapQPixmap 对象,表示要用作填充图案的图像。
    • 示例
      QPixmap pixmap(":/images/pattern.png");
      QBrush brush(pixmap); // 使用图片作为填充图案
      
  • QBrush(const QGradient &gradient)

    • 功能:使用指定的渐变 (QGradient) 构造一个画刷,用于渐变填充。
    • 参数
      • gradientQGradient 对象,表示渐变的定义。
    • 示例
      QLinearGradient gradient(0, 0, 100, 100);
      gradient.setColorAt(0, Qt::white);
      gradient.setColorAt(1, Qt::black);
      QBrush brush(gradient); // 使用渐变作为填充
      
示例:
//添加到combox的代码和线条Brush(`QPen`的示例二)很像,这里就不添加了

void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    QBrush brush(Qt::green,m_brushStyle);
    //渐变和纹理要单独处理
    if (m_brushStyle == Qt::LinearGradientPattern) {
        //线性渐变
        QLinearGradient linearGradient(0, 50, 100, 50);
        linearGradient.setColorAt(0.0, QColor("#ff9a9e"));
        linearGradient.setColorAt(0.5,QColor("#fd9a14"));
        linearGradient.setColorAt(1.0,QColor("#fad0c4"));
        painter.setBrush(linearGradient);
    } else if (m_brushStyle == Qt::RadialGradientPattern) {
        //Radial
        QRadialGradient radialGradient(50,50,50,70,70);
        radialGradient.setColorAt(0.0, QColor("#272727"));
        radialGradient.setColorAt(0.5,QColor("#fc9191"));
        radialGradient.setColorAt(1.0,QColor("#f9f9f9"));
        painter.setBrush(radialGradient);
    } else if (m_brushStyle == Qt::ConicalGradientPattern) {
        //Conical
        QConicalGradient conicalGradient(50,50,150);
        conicalGradient.setColorAt(0.0, QColor("#ff00cc"));
        conicalGradient.setColorAt(0.2,QColor("#ffcc00"));
        conicalGradient.setColorAt(0.5,QColor("#00ffcc"));
        conicalGradient.setColorAt(1.0,QColor("#ff0066"));
        painter.setBrush(conicalGradient);
    } else if (m_brushStyle == Qt::TexturePattern) {
        // 纹理/材质
        painter.setBrush(QBrush(QPixmap("D:/all_the_code/qt_code/ts/playQPainter/lyf.jpg")));
    } else {
        painter.setBrush(brush);
    }

    painter.drawRect(50,50,300,300);

}

在这里插入图片描述
渐变
在这里插入图片描述
纹理
在这里插入图片描述

5. setBackgroundMode()backgroundMode()(先已弃用)

  • void setBackgroundMode(Qt::BGMode mode);
    设置背景模式,Qt5.14.2目前只有这两种模式Qt::OpaqueMode(不透明模式) 和 Qt::TransparentMode(透明模式)。
  • Qt::BGMode backgroundMode() const;
    返回当前的背景模式。
    setBackgroundMode(Qt::TransparentMode)setBackgroundMode(Qt::OpaqueMode) 是 Qt 3.x 时代的方法,用于设置窗口小部件的背景模式。它们之间的区别主要在于控件的背景如何与父控件或其他背景内容进行叠加或覆盖。
5.1 Qt::TransparentMode
  • 透明模式:当控件的背景模式设置为 Qt::TransparentMode 时,控件不会主动绘制其背景。这意味着控件的背景将变得透明,显示出其父控件的背景或底层的内容。
  • 效果:这种模式通常用于需要控件叠加显示的情况,例如在一个复杂的用户界面中,多个控件可能需要重叠显示。
5.2 Qt 4.x 及以后的版本

需要注意的是,从 Qt 4.x 开始,setBackgroundMode 方法已被弃用(既然已经弃用就不说了),Qt 使用了更灵活的机制来管理控件背景,例如 QPalette 和属性系统(如 Qt::WA_OpaquePaintEventQt::WA_TranslucentBackground)。这些新的机制提供了更多的控制和更高的绘制性能。

6. QPoint brushOrigin() const;void setBrushOrigin(int x, int y);void setBrushOrigin(const QPoint &);void setBrushOrigin(const QPointF &);

6.1QPoint brushOrigin() const;
  • 功能:返回当前画刷的原点位置。画刷原点用于控制画刷的起始位置,当填充图案时,这个原点决定了图案的对齐方式。
  • 返回值:一个 QPoint 对象,表示当前画刷的原点位置。
6.2 void setBrushOrigin(int x, int y);
  • 功能:设置画刷的原点位置,使用整数坐标 (x, y) 来指定新的原点位置。
  • 参数
    • x:新的原点的 x 坐标。
    • y:新的原点的 y 坐标。
6.3 void setBrushOrigin(const QPoint &);
  • 功能:设置画刷的原点位置,使用一个 QPoint 对象来指定新的原点位置。
  • 参数
    • QPoint &:表示新的原点位置的 QPoint 对象。
6.4 void setBrushOrigin(const QPointF &);
  • 功能:设置画刷的原点位置,使用一个 QPointF 对象(即浮点数坐标)来指定新的原点位置。
  • 参数
    • QPointF &:表示新的原点位置的 QPointF 对象。

7. void setBackground(const QBrush &bg);const QBrush &background() const;

  • void setBackground(const QBrush &bg);

  • 功能:设置当前绘制环境的背景画刷。这个背景画刷通常在透明模式下使用,用于在绘制透明内容时填充背景。

  • 参数

    • QBrush &bg:用于绘制背景的 QBrush 对象。
  • const QBrush &background() const;

  • 功能:返回当前设置的背景画刷。

  • 返回值:一个常量引用,指向当前使用的背景 QBrush 对象。

8. setOpacity()opacity()

  • qreal opacity() const;
    返回当前的透明度值。
  • void setOpacity(qreal opacity);
    设置透明度,取值范围为 01。这个我们上节说过,这里也就不过多赘述了。
示例:
QPainter painter(this);
painter.setOpacity(0.5);
painter.drawEllipse(50, 50, 100, 100);

9. 裁剪家族

这篇写的太多了,裁剪家族留到下篇博客去写。

10. save()restore()

  • void save();
    保存当前的绘图状态(如笔、画刷、变换等)。
  • void restore();
    恢复到上次 save() 时保存的状态。
示例:
void PaintWidget::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);
    QPainter painter(this);

    QBrush brush(Qt::green,m_brushStyle);
    painter.setPen(QPen(Qt::red));
    painter.setBrush(brush);
    painter.save();
    painter.drawRect(50,50,300,300);
    QPen pen;
    pen.setColor(Qt::green);
    pen.setWidth(10);
    pen.setStyle(Qt::DashDotDotLine);
    painter.setPen(pen);
    painter.drawRect(150,150,100,100);
    //恢复之后
    painter.restore();
    painter.drawRect(250,250,50,50);


}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

彻底改变音乐产业——人工智能如何实现利润最大化并重塑市场

引言 索尼音乐 收购 以惊人的 1 亿英镑收购了 Queen 的音乐目录。近年来&#xff0c;我们看到投资基金投入数亿美元收购 Justin Bieber、Bruce Springsteen、Katy Perry 等顶级艺术家的音乐版权。据 Cambridge Associates 称&#xff0c;从 2013 年到 2017 年&#xff0c;仅音…

.NET COER+CONSUL微服务项目在CENTOS环境下的部署实践

一、整体的环境安装与部署 1.1、DOCKER环境的部署 1.1.1 安装DOCKER yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast && yu…

python学习9-数据获取与整理5

有点是生成快&#xff0c;如果想炫酷 还是要前端生成&#xff0c;比如 echarts Matplotlib可视化 Matplotlib是Python中最重要的数据可视化库之一&#xff0c;它提供了多种绘图工具&#xff0c;可以生成各种硬拷贝格式和交互式环境下的多种平台上的图形。本文将详细讲解Matplo…

【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【python报错已解决】`Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在开发过程中&#xff0c;环境配置常常会引发一些难以预料的报错。如何快速定位并解决这些问题&#xff0c;成…

【C++ Primer Plus习题】5.6

问题: 解答: #include <iostream> using namespace std;#define MONTHSCOUNT 12 #define YEARS 3int main() {string months[MONTHSCOUNT] { "January","February","March","April","May","June","J…

10倍加速LLM计算效率:消失的矩阵乘

矩阵乘法&#xff08;MatMul&#xff09;是深度学习中的主要计算瓶颈&#xff0c;尤其在ChatGPT等Transformer模型中&#xff0c;矩阵乘法的运行时长约占其总运行时长的45-60%&#xff0c;解决这一挑战对发展更经济的大模型具有重要意义。 为此&#xff0c;加州大学的研究人员在…

服务器搭建记录(两台服务器通过一个路由器的LAN口联网)

目录 服务器搭建记录&#xff08;两台服务器通过一个路由器的LAN口联网&#xff09;操作步骤&#xff1a;一、安装N卡驱动二、安装cuda三、安装cudnn四、配置SSH五、为服务器创建新sudo用户账号六、安装docker和NVIDIA-docker七、通过联网路由器 遇到的一些问题&#xff1a;参考…

小白之 FastGPT Windows 本地化部署

目录 引言环境步骤1. 安装 docker2. 启动 docker3. 浏览器访问4. One API 配置语言模型、向量模型渠道和令牌5. 创建 FastGPT 知识库6. 创建 FastGPT 应用 官方文档 引言 部署之前可以先看一下 RAG 技术原理&#xff0c;也可以后面回过头来看&#xff0c;对一些概念有些了解&a…

【C++指南】类和对象(二)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注

【leetcode】学习计划 - 面试经典150题 - 二叉树系列1

面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09; 目录 二叉树 104. 二叉树的最大深度 100. 相同的树 226. 翻转二叉树 101. 对称二叉树 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 二叉树结构 // Definition for a bin…

SpringSecurity前后端分离代码

1. 搭建 SpringBoot工程 1) 新建 boot 项目 只要一个 web 依赖 创建好的初始目录&#xff0c;直接将 demos 包删除。 导入依赖 <!-- security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-se…

redis | 认识非关系数据库Redis的字符串数据类型及过期时间expire的作用

Redis 非关 kv型 数据类型字符串数值操作 应用场景 ⭐字符串命令练习⭐⭐过期时间设定 expire ⭐⭐⭐检查过期时间 ttl key删除过期key机制惰性删除定期删除 数据类型 数据类型丰富&#xff0c;字符串strings,散列hashes,列表lists&#xff0c;集合sets,有序集合sorted sets等等…

MySQL Order By 工作原理探究以及索引优化手段

背景 这篇文章出发的契机&#xff0c;主要是看到京东定时任务优化里面有使用到「游标」这种策略去完成查询优化 https://mp.weixin.qq.com/s/aYJV3Z-1MZ_a6tUjoHa_9g 刚好之前自己在开发业务的时候&#xff0c;也碰到类似的场景&#xff0c;需要在每个季度末将被申诉的卡片更…

流媒体协议之RTMP

一、RTMP 协议概述 今天我们要一起了解的这个协议叫 RTMP 协议&#xff0c;它并不复杂&#xff0c;对于拉流相关的协议&#xff0c;我们可以先思考一下拉流一般要交互什么&#xff0c;我理解有以下几项&#xff0c; 连接信息&#xff1a;包括服务器的地址、端口号等&#xff…

每日Attention学习16——Multi-layer Multi-scale Dilated Convolution

模块出处 [CBM 22] [link] [code] Do You Need Sharpened Details? Asking MMDC-Net: Multi-layer Multi-scale Dilated Convolution Network For Retinal Vessel Segmentation 模块名称 Multi-layer Multi-scale Dilated Convolution (MMDC) 模块作用 多尺度特征提取与融合…

一家物流装备企业终止,业绩下滑严重,恐不符合创业板新上市标准

鸿安机械终止的原因如下&#xff1a;首先&#xff0c;报告期内鸿安机械的营业收入和净利润出现下滑趋势&#xff0c;公司最近一年净利润恐不达标&#xff0c;或许不能满足创业板更新的第一套上市标准&#xff1b;其次&#xff0c;鸿安机械经营业绩对比同行业可比公司&#xff0…

笔记整理—uboot启动过程(5)BL2板级初始化

上一章说到了uboot在BL2阶段大概都要干什么&#xff0c;也说到了为了实现这些要先进行内存排布&#xff0c;实现了这些后便可实现BL2部分的板级初始化。首先先来看一下init_fnc_ptr函数指针。 for(init_fnc_ptrinit_sequence;*init_fnc_ptr;init_fnc_ptr){if((*init_fnc_ptr)(…

一文带你了解html标签

一、文档结构标签 <html>&#xff1a;网页的根标签 &#xff0c;嵌套包含所有标签。 <head>&#xff1a;头标签&#xff0c;包含文档的元数据用于编写网页的修饰内容&#xff0c;附加信息。 <body>&#xff1a;身体标签&#xff0c;用于编写展示内容&…

精益工程师资格证书:2024年CLMP报名指南

随着全球对精益管理的需求日益增长&#xff0c;精益管理专业人士资格认证&#xff08;CLMP&#xff09;正成为越来越多精益工程师和精益管理人员提升职业竞争力的首选。作为一种注重管理而非生产的认证&#xff0c;CLMP不仅适用于制造业的专业人士&#xff0c;也吸引了各行业的…