Qt_绘图

news2024/11/19 20:25:10

目录

1、绘图核心类

2、QPainter类的使用

2.1 绘制线段 

2.2 绘制矩形 

2.3 绘制圆形 

2.4 绘制文本 

3、QPen类的使用

3.1  使用画笔

4、QBrush类的使用 

4.1 使用画刷

5、绘制图片 

5.1 测试QPixmap

5.1.1 图片移动

5.1.2 图标缩小 

5.1.3 旋转图片 

5.1.4 将QPixmap作为绘图设备 

5.2 测试QImage 

5.3 测试QPicture

结语 


前言:

        Qt提供了DIY度极强的绘图功能,目的就是解决在特殊场景时,使用系统提供的控件无法达到预期的效果。Qt的绘图功能提供了相关的方法,允许开发者在界面中绘制任意的图形形状,以完成更复杂的界面设计。

1、绘图核心类

         要想使用绘图功能,则必须用Qt提供的与绘图相关的类来实例化出对象,常用的核心类介绍如下(通过以下类的直译也可以看出其作用):

QPainter(画家)
进行绘图操作的最基本的类,该类提供了⼀系列drawXXX方法,允许在界面中绘制各种图形
QPen(画笔)
描述用QPainter画出来的线的样式
QBrush(画刷)
用来填充用QPainter画出来区域
QPaintDevice(画板)
描述用QPainter画出来图形在哪个对象上,比如画在QWidget上,则QWidget就是画板,而且QWidget本身就继承自QPaintDevice,所以他本就可以作为被画对象

        值得注意的是:绘图操作不能直接在界面的构造函数处执行,比如不能在QWidget构造函数中进行绘图,原因很简单,可以理解为绘图的前提是必须得有画板,而执行到QWidget构造函数时,还没有生成完整的画板,因此哪怕此时绘图了也不能在最终的界面上显示出来,因为“画快了”

        所以把绘图操作放到Qt提供的paintEvent事件中(即重写该事件,实现绘图功能),而paintEvent事件会在以下情况自动触发并执行对应的动作:

1、控件首次创建的时候。

2、控件被遮挡后再解除遮挡的时候。(比如用一个界面去挡住另一个界面,然后将他们分开,他们不会影响彼此的界面内容,原因就是paintEvent的执行动作在重新绘图)

3、将窗口最小化的时候。(然后恢复窗口,窗口的内容不会受到影响(注:窗口实际上就是控件))

4、将控件进行放大缩小的时候。

5、在代码中主动调用repaint()或者update()函数。(这两个函数都是QWidget提供的)

        因此当paintEvent事件触发时就会重新进行绘图,这也是为什么在计算机屏幕中可以不断的来回切换各种图形界面,给人的感觉是计算机如同一本书一样可以来回翻页,实际上是计算机强大的计算能力在不断的重新绘图。

2、QPainter类的使用

        介绍QPainter类中的系列函数drawxxx的使用,即进行一些基本的绘图。

2.1 绘制线段 

        使用QPainter提供的函数drawLine进行绘制线段,该函数介绍如下:

void drawLine(const QPoint &p1, const QPoint &p2);
//p1:绘制起点坐标
//p2:绘制终点坐标

        在widget.h中声明paintEvent事件,代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent *event);//重写paintEvent事件

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

        在widget.cpp中重写paintEvent事件,代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //this表示在当前窗口中绘画
    QPainter painter(this);

    //在20,20坐标到200,20坐标画一条线
    painter.drawLine(QPoint(20,20),QPoint(200,20));
}

        运行结果如下:

2.2 绘制矩形 

        使用QPainter提供的函数drawRect进行绘制线段,该函数介绍如下:

void QPainter::drawRect(int x, int y, int width, int height);
//x:矩形左上角横坐标;
//y:矩形左上角纵坐标;
//width:矩形的宽度;
//height:矩形的⾼度

        widget.h代码依旧是声明paintEvent事件,因此不再展示widget.h代码,直接展示widget.cpp代码:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //this表示在当前窗口中绘画
    QPainter painter(this);
    //在坐标(20,20)处绘制一个长200宽200的矩形
    painter.drawRect(20,20,200,200);
}

        运行结果:

2.3 绘制圆形 

        使用QPainter提供的函数drawEllipse进行绘制线段,该函数介绍如下:

void QPainter::drawEllipse(const QPoint &center, int rx, int ry)
//center:中⼼点坐标
//rx:圆的宽度
//ry:圆的高度

        widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //this表示在当前窗口中绘画
    QPainter painter(this);

    //将绘画颜色改成红色
    painter.setPen(Qt::red);

    //在坐标(100,100)处换一个宽50高50的红色圆形
    painter.drawEllipse(QPoint(100,100),50,50);
}

        运行结果:

2.4 绘制文本 

         QPainter不仅可以绘图,还可以绘制文本,这样在界面上写字时就不再需要QLabel作为文本的载体了。使用drawText()函数来绘制文章,还可以配合setFont()函数来设置字体样式,让字体看起来更加饱满。drawText函数介绍如下:

void drawText(const QPoint &position, const QString &text)
//position表示文本的坐标
//text表示文本内容

        值得注意的是,这里文本坐标是指文本最左侧的基线出的位置,如下图:

        测试代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //this表示在当前窗口中绘画
    QPainter painter(this);

    //设置字体样式
    painter.setFont(QFont("华文行楷",30));
    //设置画笔
    painter.setPen(Qt::green);

    painter.drawText(QPoint(150,200),"雨打蕉叶又潇潇了几夜");

}

         运行结果:

3、QPen类的使用

        使用QPainter绘图时,默认有一个画笔(没有画笔则无法绘图,只不过默认画笔就是最普通的文本样式),当然也可以自定义画笔。在Qt中,QPen类表示画笔,该类定义了QPainter绘图的颜色,线条宽度、线条样式。同时通过QPen类提供的函数来设置上述属性,常用函数如下:

QPen(const QColor &color)通过QPen构造函数来设置画笔颜色
void setWidth(int width)设置画笔画出线条的宽度
void setStyle(Qt::PenStyle style)设置画笔画出线条的样式

        其中Qt::PenStyle提供了以下的风格:

        将上述的枚举常量传给setStyle,则画笔就可以画出不同的样式。

3.1  使用画笔

        对上述画矩形的代码进行画笔修饰,代码如下: 

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //this表示在当前窗口中绘画
    QPainter painter(this);

    //自定义画笔
    QPen pen(QColor(0,255,0));

    //设置画笔宽度
    pen.setWidth(30);

    //设置画笔样式
    pen.setStyle(Qt::DotLine);

    //将画笔设置到画家中
    painter.setPen(pen);

    //在坐标(20,20)处绘制一个长200宽200的矩形
    painter.drawRect(20,20,200,200);
}

        运行结果:

4、QBrush类的使用 

         QBrush类表示画刷,作用是填充图形,可以通过QBrush提供的函数,对填充样式进行更改,比如颜色、风格等。常用函数介绍如下:

QPen(const QColor &color)设置画刷的颜色
void setStyle(Qt::BrushStyle style)设置画刷的风格

        其中Qt::BrushStyle是一个枚举类型,他提供了多个枚举常量供开发者选择画刷的风格,如下图:

4.1 使用画刷

        对上述画笔代码进行添加画刷,代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    //this表示在当前窗口中绘画
    QPainter painter(this);

    //自定义画笔
    QPen pen(QColor(0,255,0));

    //设置画笔宽度
    pen.setWidth(30);

    //设置画笔样式
    pen.setStyle(Qt::DotLine);

    //将画笔设置到画家中
    painter.setPen(pen);

    //自定义画刷
    QBrush brush(Qt::cyan);

    //设置画刷的风格
    brush.setStyle(Qt::Dense1Pattern);

    //将画刷设置到画家中
    painter.setBrush(brush);

    //在坐标(20,20)处绘制一个长200宽200的矩形
    painter.drawRect(20,20,200,200);
}

         运行结果:

5、绘制图片 

        上文的例子说明了如何在界面中手动绘图,然而Qt还提供了对现有图片进行处理的类,分别是QImage、QPixmap、QBitmap和QPicture,这些都是Qt封装好的绘图设备。其中,QImage可以对图片进行像素级别的操作,QPixmap可以将图片显示到屏幕上,QBitmap是QPixmap的子类,只能显示黑白两种颜色,QPicture用来记录并重演QPainter命令。

5.1 测试QPixmap

        QPainter提供了drawPixmap函数,该函数可以将QPixmap中的资源显示在界面上,该函数介绍如下:

void drawPixmap(int x, int y, const QPixmap &pm)
//x表示图片左上角的横坐标
//y表示图片左上角的纵坐标
//pm表示图片资源

         首先需要创建一个虚拟目录(虚拟目录详细见:Qt_控件的QWidget属性介绍-第五点),如下图:

        代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

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

    //创建QPixmap对象
    QPixmap map(":/kklt.png");
    //将图片设置在坐标20,20处
    painter.drawPixmap(20,20,map);
}

         运行结果:

5.1.1 图片移动

        将上述图片进行移动操作,移动的本质是将QPainter进行移动,而不是直接对QPixmap进行移动,代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

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

    //创建QPixmap对象
    QPixmap map(":/kklt.png");

    //移动画家
    painter.translate(100,100);

    //将图片设置在坐标20,20处
    painter.drawPixmap(20,20,map);
}

        运行结果:

5.1.2 图标缩小 

        将上述图片进行缩小,函数仍然使用drawPixmap,该函数也拥有缩小的功能,代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

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

    //创建QPixmap对象
    QPixmap map(":/kklt.png");

//    //移动画家
//    painter.translate(100,100);

    //将图片设置在坐标20,20处,尺寸不变
    painter.drawPixmap(20,20,map);
    //将图片设置在坐标500,20处,尺寸为50*50像素
    painter.drawPixmap(650,20,50,50,map);
}

         运行结果:

5.1.3 旋转图片 

        旋转图片的逻辑稍微复杂点,使用QPainter类中的rotate()函数进行旋转,并且旋转的不是图片,而是QPainter本身,所以会导致一种情况,即旋转之后的QPainter不在当前窗口中,然后我们在该QPainter上显示的图片也不会在当前窗口中显示,如下图:

        从这里也可以得到一个结论:QPainter是一种类似于”附在“窗口界面上的媒介,我们往窗口中写入的资源实际上是写到该QPainter中,然后QPainter再写入至窗口中,即QPainter和窗口界面是相互独立的,且QPainter可以移动,但是当QPainter超出了窗口,则QPainter就不能将超出部分的资源写入窗口中了。因此要将旋转之后的QPainter再进行移动,将其移动回窗口界面中,注意旋转过后的原点位置以及坐标系都变了


        测试代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

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

    //创建QPixmap对象
    QPixmap map(":/kklt.png");

    //旋转QPainter,顺时针旋转90°
    painter.rotate(90);

    //将QPainter移回窗口界面中
    painter.translate(0,-500);

    //将图片设置在坐标20,20处,尺寸不变
    painter.drawPixmap(20,20,50,50,map);

}

        运行结果:

5.1.4 将QPixmap作为绘图设备 

        上述中的QPixmap是作为图片载体,然而QPixmap还可以作为绘图的对象,即将QPixmap作为画板。测试代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPixmap>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //将QPixmap作为画板,尺寸为500*500px
    QPixmap pixmap(300,300);

    //将pixmap的背景色调成白色
    pixmap.fill(Qt::white);

    //让画家在QPixmap上绘画
    QPainter painter(&pixmap);

    //在QPixmap上画一个圆
    painter.drawEllipse(QPoint(100,100),50,50);

    //为了观察是否画在QPixmap上,将QPixmap上的内容保存到文件中
    pixmap.save("D:\\Qt_code\\QPixmap\\pix.png");
}

Widget::~Widget()
{
    delete ui;
}

        运行结果:

5.2 测试QImage 

        QImage也可以像QPixmap一样作为画板,并且也可以保存到磁盘的文件夹中,此功能就不再测试了。主要测试QImage更改像素的功能,首先重写paintEvent事件,通过函数setPixel来设置某个像素的颜色值,使用qRgb表示⼀个具体的颜色值,测试代码如下: 

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

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

    QImage image;
    image.load(":\kklt.jpg");

    //修改像素点
    for(int i = 0;i<200;i++)
        for(int j = 0;j<200;j++)
        {
            QRgb rgb = qRgb(0,255,255);
            image.setPixel(i,j,rgb);
        }

    painter.drawImage(20,20,image);
}

        运行结果:

5.3 测试QPicture

        QPicture最重要的功能是能够记录QPainter的操作步骤,他跟上述几个类不一样,上述的类是作为QPainter的画板,QPainter将最终的成品绘制在面板中呈现给用户看。而QPicture是记录QPainter绘制的操作,然后将该操作进行复盘,再将复盘的结果呈现给用户看,他们本质上大同小异。


        首先需要将QPicture实例作为参数传递给QPainter::begin()函数,以便告诉系统开始记录,记录完毕后使用QPainter::end()命令终止。测试代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPicture picture;
    QPainter painter;

    painter.begin(&picture);
    painter.drawEllipse(20,20,50,50);//画一个圆
    painter.end();

    //此时picture中存放的就是QPainter的操作步骤,将picture保存到磁盘上
    picture.save("D:\\Qt_code\\QPicture\\pic.pic");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter1(this);

    //从磁盘上加载到picture1中
    QPicture picture1;
    picture1.load("D:\\Qt_code\\QPicture\\pic.pic");
    
    //将picture1的内容用painter1画出来,此时picture1里面存放的并不是图形
    painter1.drawPicture(30,30,picture1);

}

        测试结果:

结语 

        以上就是关于Qt绘图的讲解,Qt内部提供了许多功能齐全的部分供我们使用,因此在大部分的场景下很少用到绘图功能,但是不排除一些特别场景,并且这些内置控件的底层也是由绘图一步步画出来的,因此了解绘图也可以更好的了解这些控件的原理。其次就是绘图可以让开发者进行界面开发时拥有很高的自由度,设计一些样式时不再依赖控件作为载体。

        最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!   

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

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

相关文章

【逐行注释】MATLAB下的粒子滤波代码(三维状态与观测,可直接复制粘贴到MATLAB上面运行)

文章目录 程序设计1. 介绍2. 系统模型3. 算法步骤源代码(直接复制到MATLAB上面可以运行)运行结果程序设计 1. 介绍 粒子滤波(Particle Filter, PF)是一种基于贝叶斯理论的递归估计方法,广泛用于动态系统状态的估计和跟踪。该方法通过一组粒子(即假设的状态)及其权重来…

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

5款惊艳全网的AI写作论文神器!从此告别写作烦恼!

在当今的学术研究和写作领域&#xff0c;撰写高质量的论文是一项挑战性的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;AI论文写作工具逐渐成为帮助学者和学生提高写作效率的重要工具。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论…

ECharts 快速使用

最终效果 使用介绍 echarts图表的绘制&#xff0c;大体分为三步&#xff1a; 根据 DOM实例&#xff0c;通过 echarts.init方法&#xff0c;生成 echarts实例构建 options配置对象&#xff0c;整个echarts的样式&#xff0c;皆有该对象决定最后通过实例.setOption方法&#xf…

【测试-BUG篇】软件测试的BUG知识你了解多少呢?

文章目录 1. 软件测试的生命周期2. BUG3. BUG的生命周期4. 与开发人员起争执怎么办 1. 软件测试的生命周期 &#x1f34e;软件测试 贯穿整个软件的生命周期&#xff1b; &#x1f34e;软件测试的生命周期是指测试流程&#xff1b; ①需求分析 用户角度&#xff1a;软件需求是…

C++:一文搞懂友元类(friend class)

C的友元&#xff08;friend&#xff09;是个很重要的概念&#xff0c;好些朋友对此却很迷惑&#xff0c;本文将对友元类&#xff08;friend class&#xff09;详细讲解&#xff0c;一文搞懂。 友元的特性&#xff1a; 1、使用friend修饰的友元类可以访问本类的私有成员(priva…

中国电信解锁万亿参数大模型:TeleAI的创新与突破

首个由万卡集群训练出来的万亿参数大模型&#xff0c;已被一家央企解锁。 具体而言&#xff0c;为了推动纯国产人工智能的探索&#xff0c;带来这条新路径的正是中国电信人工智能研究院&#xff08;TeleAI&#xff09;。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…

坡印廷矢量(也叫功率流密度,对面积积分就是功率)

坡印廷矢量在静电场&#xff0c;静磁场&#xff0c;恒定电流的电场&#xff0c;和时变电磁场中的表达式不同。 我们看时变电磁场的坡印廷矢量 坡印廷矢量就等于这个&#xff0c;其中的电场和磁场是实数表示的 坡印廷矢量用复数形式的场求 这里的E和H是复数表示的场&#xff0…

电影票接口api对接有哪些优势?

一、业务功能拓展方面的优势 多平台整合可以整合多个影院票务系统&#xff0c;通过一个接口获取众多影院的信息&#xff0c;包括影院、影厅、座位、影片、场次、日期及票价等信息&#xff0c;方便在自己的应用程序中展示这些信息&#xff0c;从而实现电影票的在线预订、支付和…

人工智能价格战——如何降低成本让人工智能更易于普及

十年前&#xff0c;开发人工智能 (AI) 是只有大公司和资金充足的研究机构才能负担得起的事情。必要的硬件、软件和数据存储成本非常高。但从那时起&#xff0c;情况发生了很大变化。一切始于 2012 年的 AlexNet&#xff0c;这是一种深度学习模型&#xff0c;展示了神经网络的真…

微服务jvisualvm解析部署使用全流程

1、介绍 VisualVM 是Netbeans的profile 2、启动 进入正在使用的jdk下bin目录&#xff0c;运行jvisualvm.exe。 3、选中要监控的线程 4、安装gc插件 5、插件安装报错 VisualVM: Plugins Centers 访问这个地址&#xff0c;找到对应版本再配置 https://visualvm.github.io/uc/…

【CKA】六、四层负载-Service应用

6、四层负载-Service应用 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 1、编辑front-end的deploy服务&#xff0c;添加端口信息 2、暴露svc端口 3. 官网地址&#xff1a; https://kubernetes.io/zh-cn/docs/tutorials/services/connect-applications-service/#the-ku…

nominatim部署OSM离线地图

第一步&#xff1a;准备一个大内存的服务器&#xff0c;磁盘PG大小根据实际导入的数据确定&#xff0c;全量数据1T&#xff0c;osm.pdf属于压缩文件&#xff0c;如果能下载&#xff0c;但下载很慢&#xff0c;可以尝试用迅雷下载。 osm.pdf下载 osm.pdf另外一个下载路径 全量数…

学生党有福了!国内最好的4款AI论文润色机构

在当今学术研究和写作领域&#xff0c;AI技术的应用已经变得越来越普遍。AI论文润色工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。这些工具极大地提高了写作效率和质量&#xff0c;尤其对于学生党来说&#xff0c;选择合适的AI论…

基于单片机多功能称重系统设计

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

2024年3分钟手把手教你激活Guitar Pro 8破解版

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Windows如何安装激活。 GuitarPro8安装包和许可证密钥夸克…

Acwing 高斯消元

高斯消元能在 O ( n 3 ) O(n^3) O(n3)的时间复杂度内求解n个方程&#xff0c;n个未知数的多元线性方程组&#xff0c;即 a 11 x 1 a 12 x 2 a 13 x 3 ⋯ a 1 n x n b 1 a 21 x 1 a 22 x 2 a 23 x 3 ⋯ a 2 n x n b 2 … a n 1 x 1 a n 2 x 2 a n 3 x 3 ⋯ a n n…

STM32CubeMX工程printf问题

1、不能打印输出的问题 利用STM32CubeMX创建了一个带FreeRTOS系统的工程&#xff0c;使能多线程保护。 然后在任务函数中调用了printf函数。 可是电脑的串口上没有信息输出&#xff0c;程序进入了硬件错误中断。 原来是因为自动生成的串口初始化函数MX_LPUART1_UART_Init中&a…

话术挂断之后是否处理事件

文章目录 前言联系我们解决方案方案一方案二 前言 流程&#xff1a;自动外呼进入机器人话术。问题&#xff1a;在机器人放音时用户挂断后&#xff0c;话术还会继续匹配流程&#xff0c;如果匹配上的是放音节点&#xff0c;还会进行放音&#xff0c;那么在数据库表conversation…

利用vue-capper封装一个可以函数式调用图片裁剪组件

1. 效果 const cropData await wqCrop({prop:{img,autoCrop: true, // 是否开启截图框maxImgSize: 600,autoCropWidth: 30,canMove: true, // 图片是否可移动canMoveBox: true, // 截图框是否可移动fixedBox: false, // 截图框是否固定}});console.log(cropData);使用wqCrop会…