QT绘画仪表盘

代码一步一步讲,就不写用啥之类的了,暗部走来,自己找使用的类以及使用方法

1、创建工程

2、重载paintEvent

#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
protected:
    virtual void paintEvent(QPaintEvent *event);
void MainWindow::paintEvent(QPaintEvent *event)
{

}

3、构建绘画对象,调整表盘位置、画笔位置、刷子之类的

    //创建对象
    QPainter m_painter(this);
    //表盘宽度不变,高度-100,中心位置在前面两个小的的中间
    int m_width = this->width();
    int m_height = this->height() - 100;
    int radius = ((m_width > m_height)?m_height:m_width)/2.0;
    //移动画笔到中下方位置
    m_painter.translate(m_width/2,m_height*0.6);
    //启用反锯齿
    m_painter.setRenderHint(QPainter::Antialiasing, true);
    m_painter.setPen(Qt::NoPen);
    //设置画刷颜色
    m_painter.setBrush(QColor(138,43,226));

4、画刻度线

//刻度线
    DrawSmallScale(m_painter, radius - 60);
private:
    void DrawSmallScale(QPainter & painter, int radius);
void MainWindow::DrawSmallScale(QPainter & painter, int radius)
{
    //组装点路径图(刻度)
    QPainterPath pointPath_small;
    pointPath_small.moveTo(-2, -2);
    pointPath_small.lineTo(2, -2);
    pointPath_small.lineTo(2, 8);
    pointPath_small.lineTo(-2, 8);

    QPainterPath pointPath_big;
    pointPath_big.moveTo(-2, -2);
    pointPath_big.lineTo(2, -2);
    pointPath_big.lineTo(2, 20);
    pointPath_big.lineTo(-2, 20);

    //绘制61个小点
    for(int i = 0; i < 121; i += 2)
    {
        QPointF point(0, 0);
        painter.save();
        point.setX(radius* qCos(((210-i*2)*M_PI)/180));
        point.setY(radius* qSin(((-210+i*2)*M_PI)/180));
        painter.translate(point.x(), point.y());
        painter.rotate(-120+i*2);

        if(i<80)
        {
            painter.setBrush(QColor(0, 0, 0));
        }
        if(i>=80)
        {
            painter.setBrush(QColor(235, 70, 70));
        }
        if(i%5 == 0)
        {
            painter.drawPath(pointPath_big);//绘画大刻度
        }
        else
        {
            painter.drawPath(pointPath_small);//绘画小刻度
        }
        painter.restore();
    }
}

5、刻度数字

    //刻度数字
    DrawDigital(m_painter, radius - 90);
void DrawDigital(QPainter & painter, int radius);
void MainWindow::DrawDigital(QPainter &painter, int radius)
{
    //设置画笔,画笔默认NOPEN
    painter.setPen(QColor(0, 0, 0));
    QFont font;
    font.setFamily("Arical");
    font.setPointSize(15);
    font.setBold(true);
    painter.setFont(font);
    for(int i=0;i<13;++i)
    {
        QPointF point(0, 0);
        painter.save();
        point.setX(radius* qCos(((210-i*20)*M_PI)/180));
        point.setY(radius* qSin(((210-i*20)*M_PI)/180));
        painter.translate(point.x(), -point.y());
        painter.rotate(-120+i*20);
        painter.drawText(-25, 0, 50, 20, Qt::AlignCenter, QString::number(i*20));
        painter.restore();
    }
    //还原画笔
    painter.setPen(Qt::NoPen);
}

6、逐渐发光外扇形

/*所有形状绘画*/
    //逐渐发光外扇形
    DrawCircle(m_painter, radius - 35);
void DrawCircle(QPainter & painter, int radius);
void MainWindow::DrawCircle(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath outRing;
    QPainterPath inRing;
    outRing.moveTo(0,0);
    inRing.moveTo(0,0);
    outRing.arcTo(-radius, -radius, 2*radius, 2*radius, -30, 240);
    inRing.addEllipse(-radius+50, -radius+50, 2*(radius-50), 2*(radius-50));
    outRing.closeSubpath();
    //设置渐变色
    QRadialGradient radialGradient(0,0,radius,0,0);
    radialGradient.setColorAt(1, QColor(0,82,199));
    radialGradient.setColorAt(0.92, Qt::transparent);
    //设置画刷
    painter.setBrush(radialGradient);
    //大圆减小圆
    painter.drawPath(outRing.subtracted(inRing));
    //恢复
    painter.restore();
}

7、指针

void DrawPointer(QPainter & painter, int radius);
//指针
    DrawPointer(m_painter, radius-130);
void MainWindow::DrawPointer(QPainter &painter, int radius)
{
    //组装点路径图
    QPainterPath pointPath;
    pointPath.moveTo(10,0);
    pointPath.lineTo(1,-radius);
    pointPath.lineTo(-1,-radius);
    pointPath.lineTo(-10,0);
    pointPath.arcTo(-10,0,20,20,180,180);
    QPainterPath inRing;
    inRing.addEllipse(-5,-5,10,10);
    painter.save();

    //计算并选择绘图对象坐标
    painter.rotate(degRotate-120);
    painter.setBrush(QColor(255,0,0));
    painter.drawPath(pointPath.subtracted(inRing));
    painter.restore();
}

8、最外细圆圈

void DrawCircle_line(QPainter & painter, int radius);
//最外细圆圈
    DrawCircle_line(m_painter, radius-35);
void MainWindow::DrawCircle_line(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath outRing;
    QPainterPath inRing;
    outRing.moveTo(0,0);
    inRing.moveTo(0,0);
    outRing.arcTo(-radius,-radius,2*radius,2*radius,-30,240);
    inRing.addEllipse(-radius+2,-radius+2,2*(radius-2),2*(radius-2));
    outRing.closeSubpath();

    //设置画刷
    painter.setBrush(QColor(5,228,255));
    //大圆减小圆
    painter.drawPath(outRing.subtracted(inRing));
    painter.restore();
}

9、中间大圆

void DrawCircle_bom_big(QPainter & painter, int radius);
//中间大圆
    DrawCircle_bom_big(m_painter, radius-150);
void MainWindow::DrawCircle_bom_big(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath inRing;
    inRing.moveTo(0,0);
    inRing.addEllipse(-radius+50,-radius+50,2*(radius-50),2*(radius-50));
    //设置画刷
    painter.setBrush(QColor(10,20,30));
    painter.drawPath(inRing);
    painter.restore();
}

10、逐渐发光内圈

void DrawCircle_bom_shine(QPainter & painter, int radius);
//逐渐发光内圈
    DrawCircle_bom_shine(m_painter, radius-230);
void MainWindow::DrawCircle_bom_shine(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //渐变色
    QRadialGradient radialGradient(0,0,radius,0,0);
    radialGradient.setColorAt(0.5,QColor(10,68,185,150));
    radialGradient.setColorAt(1.0,Qt::transparent);
    painter.setBrush(QBrush(radialGradient));
    painter.drawRect(-radius,-radius,2*radius,2*radius);
    painter.restore();
}

11、中间小圆

void DrawCircle_bom_small(QPainter & painter, int radius);
//中间小圆
    DrawCircle_bom_small(m_painter, radius-200);
void MainWindow::DrawCircle_bom_small(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath inRing;
    inRing.moveTo(0,0);
    inRing.addEllipse(-radius+50,-radius+50,2*(radius-50),2*(radius-50));
    //设置画刷
    painter.setBrush(QColor(10,20,30));
    painter.drawPath(inRing);
    painter.restore();
}

12、动态扇形环

void DrawCircle_arc(QPainter & painter, int radius);
//动态扇形环
    DrawCircle_arc(m_painter, radius-40);
void MainWindow::DrawCircle_arc(QPainter &painter, int radius)
{
    QRect rect(-radius, -radius, 2*radius, 2*radius);
    QConicalGradient Conical(0,0,-70);

    Conical.setColorAt(0.1, QColor(255,88,127,200));//红色
    Conical.setColorAt(0.5, QColor(53,179,251,150));//蓝色
    painter.setBrush(Conical);
    painter.drawPie(rect, 210*16, -(degRotate)*16);
}

由于是动态的,需要加入定时器与按键事件模拟加减速

13、单位与时速

固定下窗口大小

setFixedSize(1280,800);

定义一些全局变量

private:
    int degRotate = 0;
    int radius;//仪表盘中心位置
    int direction;//指针运动的方向,1为前进,0为后退

画表盘文字

void DrawUnit(QPainter & painter, int radius);
    void DrawNum(QPainter & painter, int radius);
//单位
    DrawUnit(m_painter,radius-390);
    //时速
    DrawNum(m_painter,radius-300);
void MainWindow::DrawUnit(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //设置笔
    painter.setPen(QColor(255,255,255));
    //设置字体
    QFont font;
    font.setFamily("Arial");
    font.setPointSize(16);
    font.setBold(true);
    painter.setFont(font);
    //画文字
    painter.drawText(-50,-radius,100,20,Qt::AlignCenter,QString("km/h"));

    painter.setPen(QColor(0,0,0));
    painter.drawText(-60,-radius+130,120,40,Qt::AlignCenter,QString("当前车速"));

    painter.setPen(QColor(0,0,0,50));
    painter.drawText(-120,-radius+280,250,40,Qt::AlignCenter,QString("-请按space键加速-"));
    painter.restore();
}

void MainWindow::DrawNum(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //设置笔
    painter.setPen(QColor(255,255,255));
    //设置字体
    QFont font;
    font.setFamily("Arial");
    font.setPointSize(45);
    painter.setFont(font);
    //写文字
    painter.drawText(-75,-radius-20,150,100,Qt::AlignCenter,QString::number(degRotate));
    painter.restore();
}

14、按键事件

添加定时器和按键事件的头文件

#include <QTimer>
#include <QKeyEvent>

重写按键虚函数

    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->key() == Qt::Key_Space)
    {
        if(direction == 0)
        {
            myTimer->start(1);
            direction = 1;
        }
    }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->key() == Qt::Key_Space)
        direction = 0;
}

构建定时器对象

private:
    int degRotate = 0;
    int radius;//仪表盘中心位置
    int direction;//指针运动的方向,1为前进,0为后退
    QTimer *myTimer;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(1280,800);
    
    //定时器
    myTimer = new QTimer(this);
    connect(myTimer, SIGNAL(timeout()), this, SLOT(slot_seed_changed()));
}

新建速度变化的槽函数

private slots:
    void slot_seed_changed();
void MainWindow::slot_seed_changed()
{
    if(direction == 1)//加速
    {
        degRotate++;
        if(degRotate > 240)
        {
            degRotate = 240;
        }
    }
    else if(direction == 0)//减速
    {
        degRotate--;
        if(degRotate<0)
        {
            degRotate = 0;
            myTimer->stop();
        }
    }
    update();//刷新画面
}

15、动画效果

汽车仪表盘

16、完整代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QtMath>

#include <QTimer>
#include <QKeyEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

protected:
    virtual void paintEvent(QPaintEvent *event);
    virtual void keyPressEvent(QKeyEvent *event);
    virtual void keyReleaseEvent(QKeyEvent *event);

private:
    void DrawSmallScale(QPainter & painter, int radius);
    void DrawDigital(QPainter & painter, int radius);
    void DrawCircle(QPainter & painter, int radius);
    void DrawCircle_arc(QPainter & painter, int radius);
    void DrawPointer(QPainter & painter, int radius);
    void DrawCircle_line(QPainter & painter, int radius);
    void DrawCircle_bom_big(QPainter & painter, int radius);
    void DrawCircle_bom_shine(QPainter & painter, int radius);
    void DrawCircle_bom_small(QPainter & painter, int radius);
    void DrawUnit(QPainter & painter, int radius);
    void DrawNum(QPainter & painter, int radius);


private:
    int degRotate = 0;
    int radius;//仪表盘中心位置
    int direction;//指针运动的方向,1为前进,0为后退
    QTimer *myTimer;

private slots:
    void slot_seed_changed();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(1280,800);

    //定时器
    myTimer = new QTimer(this);
    connect(myTimer, SIGNAL(timeout()), this, SLOT(slot_seed_changed()));
}

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

void MainWindow::paintEvent(QPaintEvent *event)
{
    //创建对象
    QPainter m_painter(this);
    //表盘宽度不变,高度-100,中心位置在前面两个小的的中间
    int m_width = this->width();
    int m_height = this->height() - 100;
    int radius = ((m_width > m_height)?m_height:m_width)/2.0;
    //移动画笔到中下方位置
    m_painter.translate(m_width/2,m_height*0.6);
    //启用反锯齿
    m_painter.setRenderHint(QPainter::Antialiasing, true);
    m_painter.setPen(Qt::NoPen);
    //设置画刷颜色
    m_painter.setBrush(QColor(138,43,226));
    //刻度线
    DrawSmallScale(m_painter, radius - 60);
    //刻度数字
    DrawDigital(m_painter, radius - 90);

    /*所有形状绘画*/
    //逐渐发光外扇形
    DrawCircle(m_painter, radius - 35);
    //动态扇形环
    DrawCircle_arc(m_painter, radius-40);
    //指针
    DrawPointer(m_painter, radius-130);
    //最外细圆圈
    DrawCircle_line(m_painter, radius-35);
    //中间大圆
    DrawCircle_bom_big(m_painter, radius-150);
    //逐渐发光内圈
    DrawCircle_bom_shine(m_painter, radius-230);
    //中间小圆
    DrawCircle_bom_small(m_painter, radius-200);

    //单位
    DrawUnit(m_painter,radius-390);
    //时速
    DrawNum(m_painter,radius-300);
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Space)
    {
        if(direction == 0)
        {
            myTimer->start(1);
            direction = 1;
        }
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Space)
        direction = 0;
}

void MainWindow::DrawSmallScale(QPainter & painter, int radius)
{
    //组装点路径图(刻度)
    QPainterPath pointPath_small;
    pointPath_small.moveTo(-2, -2);
    pointPath_small.lineTo(2, -2);
    pointPath_small.lineTo(2, 8);
    pointPath_small.lineTo(-2, 8);

    QPainterPath pointPath_big;
    pointPath_big.moveTo(-2, -2);
    pointPath_big.lineTo(2, -2);
    pointPath_big.lineTo(2, 20);
    pointPath_big.lineTo(-2, 20);

    //绘制61个小点
    for(int i = 0; i < 121; i += 2)
    {
        QPointF point(0, 0);
        painter.save();
        point.setX(radius* qCos(((210-i*2)*M_PI)/180));
        point.setY(radius* qSin(((-210+i*2)*M_PI)/180));
        painter.translate(point.x(), point.y());
        painter.rotate(-120+i*2);

        if(i<80)
        {
            painter.setBrush(QColor(0, 0, 0));
        }
        if(i>=80)
        {
            painter.setBrush(QColor(235, 70, 70));
        }
        if(i%5 == 0)
        {
            painter.drawPath(pointPath_big);//绘画大刻度
        }
        else
        {
            painter.drawPath(pointPath_small);//绘画小刻度
        }
        painter.restore();
    }
}

void MainWindow::DrawDigital(QPainter &painter, int radius)
{
    //设置画笔,画笔默认NOPEN
    painter.setPen(QColor(0, 0, 0));
    QFont font;
    font.setFamily("Arical");
    font.setPointSize(15);
    font.setBold(true);
    painter.setFont(font);
    for(int i=0;i<13;++i)
    {
        QPointF point(0, 0);
        painter.save();
        point.setX(radius* qCos(((210-i*20)*M_PI)/180));
        point.setY(radius* qSin(((210-i*20)*M_PI)/180));
        painter.translate(point.x(), -point.y());
        painter.rotate(-120+i*20);
        painter.drawText(-25, 0, 50, 20, Qt::AlignCenter, QString::number(i*20));
        painter.restore();
    }
    //还原画笔
    painter.setPen(Qt::NoPen);
}

void MainWindow::DrawCircle(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath outRing;
    QPainterPath inRing;
    outRing.moveTo(0,0);
    inRing.moveTo(0,0);
    outRing.arcTo(-radius, -radius, 2*radius, 2*radius, -30, 240);
    inRing.addEllipse(-radius+50, -radius+50, 2*(radius-50), 2*(radius-50));
    outRing.closeSubpath();
    //设置渐变色
    QRadialGradient radialGradient(0,0,radius,0,0);
    radialGradient.setColorAt(1, QColor(0,82,199));
    radialGradient.setColorAt(0.92, Qt::transparent);
    //设置画刷
    painter.setBrush(radialGradient);
    //大圆减小圆
    painter.drawPath(outRing.subtracted(inRing));
    //恢复
    painter.restore();
}

void MainWindow::DrawCircle_arc(QPainter &painter, int radius)
{
    QRect rect(-radius, -radius, 2*radius, 2*radius);
    QConicalGradient Conical(0,0,-70);

    Conical.setColorAt(0.1, QColor(255,88,127,200));//红色
    Conical.setColorAt(0.5, QColor(53,179,251,150));//蓝色
    painter.setBrush(Conical);
    painter.drawPie(rect, 210*16, -(degRotate)*16);
}

void MainWindow::DrawPointer(QPainter &painter, int radius)
{
    //组装点路径图
    QPainterPath pointPath;
    pointPath.moveTo(10,0);
    pointPath.lineTo(1,-radius);
    pointPath.lineTo(-1,-radius);
    pointPath.lineTo(-10,0);
    pointPath.arcTo(-10,0,20,20,180,180);
    QPainterPath inRing;
    inRing.addEllipse(-5,-5,10,10);
    painter.save();

    //计算并选择绘图对象坐标
    painter.rotate(degRotate-120);
    painter.setBrush(QColor(255,0,0));
    painter.drawPath(pointPath.subtracted(inRing));
    painter.restore();
}

void MainWindow::DrawCircle_line(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath outRing;
    QPainterPath inRing;
    outRing.moveTo(0,0);
    inRing.moveTo(0,0);
    outRing.arcTo(-radius,-radius,2*radius,2*radius,-30,240);
    inRing.addEllipse(-radius+2,-radius+2,2*(radius-2),2*(radius-2));
    outRing.closeSubpath();

    //设置画刷
    painter.setBrush(QColor(5,228,255));
    //大圆减小圆
    painter.drawPath(outRing.subtracted(inRing));
    painter.restore();
}

void MainWindow::DrawCircle_bom_big(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath inRing;
    inRing.moveTo(0,0);
    inRing.addEllipse(-radius+50,-radius+50,2*(radius-50),2*(radius-50));
    //设置画刷
    painter.setBrush(QColor(10,20,30));
    painter.drawPath(inRing);
    painter.restore();
}

void MainWindow::DrawCircle_bom_shine(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //渐变色
    QRadialGradient radialGradient(0,0,radius,0,0);
    radialGradient.setColorAt(0.5,QColor(10,68,185,150));
    radialGradient.setColorAt(1.0,Qt::transparent);
    painter.setBrush(QBrush(radialGradient));
    painter.drawRect(-radius,-radius,2*radius,2*radius);
    painter.restore();
}

void MainWindow::DrawCircle_bom_small(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //计算大小圆路径
    QPainterPath inRing;
    inRing.moveTo(0,0);
    inRing.addEllipse(-radius+50,-radius+50,2*(radius-50),2*(radius-50));
    //设置画刷
    painter.setBrush(QColor(10,20,30));
    painter.drawPath(inRing);
    painter.restore();
}

void MainWindow::DrawUnit(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //设置笔
    painter.setPen(QColor(255,255,255));
    //设置字体
    QFont font;
    font.setFamily("Arial");
    font.setPointSize(16);
    font.setBold(true);
    painter.setFont(font);
    //画文字
    painter.drawText(-50,-radius,100,20,Qt::AlignCenter,QString("km/h"));

    painter.setPen(QColor(0,0,0));
    painter.drawText(-60,-radius+130,120,40,Qt::AlignCenter,QString("当前车速"));

    painter.setPen(QColor(0,0,0,50));
    painter.drawText(-120,-radius+280,250,40,Qt::AlignCenter,QString("-请按space键加速-"));
    painter.restore();
}

void MainWindow::DrawNum(QPainter &painter, int radius)
{
    //保存绘图对象
    painter.save();
    //设置笔
    painter.setPen(QColor(255,255,255));
    //设置字体
    QFont font;
    font.setFamily("Arial");
    font.setPointSize(45);
    painter.setFont(font);
    //写文字
    painter.drawText(-75,-radius-20,150,100,Qt::AlignCenter,QString::number(degRotate));
    painter.restore();
}

void MainWindow::slot_seed_changed()
{
    if(direction == 1)//加速
    {
        degRotate++;
        if(degRotate > 240)
        {
            degRotate = 240;
        }
    }
    else if(direction == 0)//减速
    {
        degRotate--;
        if(degRotate<0)
        {
            degRotate = 0;
            myTimer->stop();
        }
    }
    update();//刷新画面
}



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博物馆环境监测系统—保护文物与观众体验的守护者

博物馆环境监测系统是现代博物馆管理的重要组成部分。利用各种传感器和监控设备&#xff0c;实时监控和记录博物馆内的温度、湿度、光照、空气质量等环境参数&#xff0c;保证博物馆内展品的安全保存和观众的舒适体验。 一、博物馆环境监测系统的背景和意义。 博物馆是珍贵文化…

JAVA医院综合绩效核算系统源码 医院绩效考核的解决方案

医院绩效考核管理系统是基于先进的信息技术开发的&#xff0c;旨在通过科学的绩效评估体系&#xff0c;对医院的运营绩效进行全面、系统的考核和管理。该系统以JAVA为主要开发语言&#xff0c;结合医院实际业务需求&#xff0c;构建了一个高效、稳定、易用的管理平台 医院绩效考…

针对 AI 优化数据湖仓一体:使用 MinIO 仔细了解 RisingWave

RisingWave 是现代数据湖仓一体处理层中的开源流数据库&#xff0c;专为性能和可扩展性而构建。RisingWave 旨在允许开发人员在流数据上运行 SQL。鉴于 SQL 是数据工程的通用语言&#xff0c;此功能非常重要。它具有强大的架构&#xff0c;包括计算节点、元节点和压缩器节点&am…

测绘行业解决方案

应用场景 - 地籍测量 业务挑战 • 人工地籍测量速度慢&#xff0c;效率低&#xff0c;工程周期长 • 外业工作量大&#xff0c;人力成本高 • 传统测绘成果限于数字线划图&#xff0c;无法直观展示地块实景效果 无人机优势 • 可实现 1:500 免像控测绘 • 高效作业&…

SpringBoot 实现RequestBodyAdvice封装统一接受类功能

一、相关往期文章 SpringBootVue实现AOP系统日志功能_aop的vue完整项目 Spring AOP (面向切面编程&#xff09;原理与代理模式—实例演示_面向切面aop原理详解 二、需求分析 按照一般情况&#xff0c;统一接受类可以像以下的方式进行处理&#xff1a; 如果不想使用 Request…

360°环绕拍摄图片的作用 欧保图 ORBITVU

360环绕拍摄图片在电商中的应用及其优势 ORBITVU 波兰 欧保图 360环绕拍摄图片是一种动态的产品展示方式&#xff0c;它允许消费者从不同角度全方位地查看产品&#xff0c;这种交互式的体验大大增强了用户的购物体验。以下是360环绕拍摄图片在电商中的一些具体应用及其带来的优…

【Linux必备工具】自动化构建工具makefile的使用详解

目录 引言 Makefile 简介 依赖关系与依赖方法 make运行规则 依赖关系示例 依赖方法 Makefile 工作原理 示例代码 清理项目与伪目标 清理示例 .PHONY总是被执行 文章手稿&#xff1a; 文章手稿见文末~ 引言 项目构建时遇到的各种挑战如文件编译顺序、库链接、依赖…

“湖仓一体架构及其应用”写作框架,系统架构设计师

论文真题 随着5G、大数据、人工智能、物联网等技术的不断成熟&#xff0c;各行各业的业务场景日益复杂&#xff0c;企业数据呈现出大规模、多样性的特点&#xff0c;特别是非结构化数据呈现出爆发式增长趋势。在这一背景下&#xff0c;企业数据管理不再局限于传统的结构化OLTP…

高互动UI设计揭秘:动画效果如何提升用户体验

动画&#xff0c;由于其酷的视觉冲击&#xff0c;往往会产生极好的用户体验。UI设计中的动态效果可以使用户界面看起来更酷&#xff0c;特别是界面的功能动画&#xff0c;是UX设计的重要组成部分&#xff0c;不容忽视。为什么UI设计的动态效果如此重要&#xff1f;接下来&#…

WIFI6E中的MESH组网功能

什么是WIFI6E和MESH组网&#xff1f; WIFI 6E 是扩展到6GHz 频段的WIFI 6无线通信技术&#xff0c;而“WIFI 6E”中的“6”是指WIFI技术的“第6代”&#xff0c;“E”则是指使用新频段的标准的最新扩展。WIFI 6E通过增加6GHz频段&#xff0c;提供更高的带宽、更低的延迟和更大…

探索Lazada商品数据宝库——一键获取商品详细数据信息

一、引言 在电商领域&#xff0c;Lazada凭借其广泛的商品种类和便捷的购物体验&#xff0c;成为东南亚地区备受欢迎的电商平台。然而&#xff0c;对于许多商家和数据分析师来说&#xff0c;获取商品详细数据信息却是一项繁琐而重要的任务。为了解决这个问题&#xff0c;我们精…

深圳学区房断崖式跌价,3年跌去10万元,更可怕的还在后面

就在房市回暖之际&#xff0c;深圳的学区房却传来让人震惊的消息&#xff0c;深圳八卦岭有小区的房价三年时间从14万元每平方跌至4万元每平方&#xff0c;这对于当下的楼市无疑是重磅炸弹&#xff0c;对人们的购房行为将产生重要影响。 深圳这个受到关注的小区为一个宿舍小区&a…

图像分割(二)——低照度下自然场景下图像分割的一种新方法

一天傍晚&#xff0c;在景观河散步&#xff0c;看到景观河旁边雕塑鸭子&#xff0c;就用手机拍摄下来&#xff0c;但由于是晚上光线不是太好&#xff0c;且雕塑下面的地板有条纹和阴影。想着尝试用传统的数字图像处理方法把鸭子从自然场景中提取出来。 读入低照度下图像&#…

Seal^_^【送书活动第7期】——《IT项目经理进阶之道》

Seal^_^【送书活动第7期】——《IT项目经理进阶之道》 一、参与方式二、本期推荐图书2.1 作者荐语2.2 编辑推荐2.3 图书简介2.4 前言2.5 目 录 三、正版购买 从领导、客户、下属、供应商四个角度&#xff0c;介绍IT项目经理在实际工作中需要面对的挑战&#xff0c;以及一些常见…

【网络安全学习】漏洞扫描:-03- Nikito与Wapiti漏洞扫描的使用

1️⃣ Nikto漏洞扫描 Nikto是一个开源的Web扫描评估程序&#xff0c;它可以对目标Web服务器进行快速而全面的检查&#xff0c;以发现各种潜在的安全问题和漏洞。 &#x1f170;️ 如何使用 ❓ nikto -Display 1234ep -h [域名或IP地址] -o nikto.html # -h参数&#xff1a;指…

实战18:基于tkinter+jupyter notebook开发的情感分析系统

项目演示: 完整代码: import pandas as pd import numpy as np from collections import Counter import re import jieba from tqdm import tqdm from sklearn.metrics import roc_curve, auc import joblib import gensim from sklearn.svm import SVC from gensim.mode…

docker启动nacos挂载目录并修改配置文件

1 通过 Docker 拉取 nacos 镜像 docker pull nacos/nacos-server:v2.1.22 创建宿主机挂载目录 # 用于挂载 nacos 的日志 mkdir -p /mydata/nacos_home/logs/ # 用于挂载 nacos 的配置 mkdir -p /mydata/nacos_home/conf/ # 用于挂载 nacos 的数据 mkdir -p /mydata/nacos_hom…

小林图解系统-四.内存管理 4.1 为什么要有虚拟内存?

虚拟内存 单片机没有操作系统&#xff0c;单片机的CPU是直接操作内存的物理地址。 要想在内存中同时运行两个程序是不可能的。如果第一个程序在2000的位置写入一个新的值&#xff0c;将会擦掉第二个程序存放在相同位置上的所有内容&#xff0c;所以同时运行两个程序会立刻崩溃…

远程桌面修改端口号后无法连接,怎么解决

远程桌面连接让用户在不同地点&#xff0c;不同设备上远程控制一台计算机&#xff0c;很大程度上节约了用户的成本并且提高了办公的灵活性和高效性。有时候修改了端口号就会连接不上&#xff0c;那该怎么办呢&#xff1f; 1. 检查本地计算机和远程计算机是否都连接了网络且网…

《精通嵌入式Linux编程》——解锁嵌入式Linux开发的无限可能

文章目录 &#x1f4d1;前言一、书籍概览与作者风采二、内容详解与特色亮点2.1 嵌入式Linux基础与入门2.2 系统编程与内核探索2.3 驱动开发与实战演练2.4 内存管理与性能优化2.5 系统调试与性能提升2.6 综合项目实践与案例分析 三、书籍价值与应用展望 &#x1f4d1;前言 在当今…