QT下使用QChart绘制曲线

目录

    • 头文件内容
    • 构造函数
    • AddSeries方法
    • UpdateSeries方法
    • AppendSeriesData方法
    • SetLegendVisiable
    • SetRubberBand
    • CPP内容
    • 测试函数

在这里插入图片描述

需要用到的头文件:

#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QValueAxis>
#include <QPoint>
#include <QtCharts/QLineSeries>
#include <QString>
#include <QGridLayout>
#include <QLegendMarker>

直白一点说明,QChart用来存放曲线坐标轴和曲线,QChartView用来存放QChart,QChartView是一个Widget,可以独立show或者和其他widget做布局。

QLineSeries是直线,上图可以算是一个折线图,Qt还有散点图、光滑的曲线图、条形图、饼状图等等。

QValueAxis是坐标轴。

头文件内容

/*!* \file curve_charts.h* \date 2023/11/18 23:08** \author * Contact:** \brief ** 基于Qt的曲线图** \note
*/#pragma once#include <unordered_map>#include <QWidget>
#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QValueAxis>
#include <QPoint>
#include <QtCharts/QLineSeries>
#include <QString>
#include <QGridLayout>
#include <QLegendMarker>
#include <QScatterSeries>#define		QString2StdString(x)	((x).toStdString())
#define		StdString2QString(x)	(QString::fromLocal8Bit(std::string(x).c_str()))QT_CHARTS_USE_NAMESPACEclass CurveCharts : public QWidget
{Q_OBJECTpublic:CurveCharts(QWidget *parent = nullptr);~CurveCharts();/*!* @func:  void AddSeries(const std::string _series_name, QPen _series_pen);* * @date:  2023/11/18* * @author:叫牌* * @brief: 添加一条曲线,如果已经有这条曲线名称添加失败** @param _series_name: 曲线名称* @param _series_pen:  曲线颜色* * @return: true添加成功,false添加失败*/bool AddSeries(const std::string& _series_name, QPen _series_pen);/*!* @func:  void UpdateSeries(const std::string _series_name, std::vector<QPoint> _charts_data);** @date:  2023/11/18** @author:叫牌** @brief: 通过曲线名称更新曲线** @param _series_name: 曲线名称* @param _charts_data: 曲线数据** @return: true更新成功,false更新失败*/bool UpdateSeries(const std::string& _series_name, std::vector<QPoint> _charts_data);/*!* @func:  void AppendSeriesData(const std::string& _series_name, std::vector<QPoint> _chart_data);** @date:  2023/11/18** @author:叫牌** @brief: 通过曲线名称追加曲线数据** @param _series_name: 曲线名称* @param _charts_data: 曲线数据** @return: true更新成功,false更新失败*/bool AppendSeriesData(const std::string& _series_name, std::vector<QPoint> _chart_data);/*!* @func:  void SetTitle(const std::string _title);** @date:  2023/11/18** @author:叫牌** @brief: 设置曲线标题** @param _title: 曲线标题** @return: 无*/void SetTitle(const std::string& _title);/*!* @func:  std::string GetTitle();** @date:  2023/11/18** @author:叫牌** @brief: 获取曲线标题** @return: 曲线标题*/std::string GetTitle();/*!* @func:  void SetXAxisRange(qreal _x_min, qreal _x_max);** @date:  2023/11/18** @author:叫牌** @brief: 设置X轴范围** @return: 无*/void SetXAxisRange(qreal _x_min, qreal _x_max);/*!* @func:  void SetYAxisRange(qreal _y_min, qreal _y_max);** @date:  2023/11/18** @author:叫牌** @brief: 设置Y轴范围** @return: 无*/void SetYAxisRange(qreal _y_min, qreal _y_max);/*!* @func:  void SetTitle(const std::string& _XTitle, const std::string& _YTitle);** @date:  2023/11/18** @author:叫牌** @brief: 设置Y轴范围* * @param _XTitle: X坐标轴标题* @param _YTitle: Y坐标轴标题** @return: 无*/void setAxisTitles(const std::string& _XTitle, const std::string& _YTitle);/*!* @func:  void SetAxisRanges(bool _flag);** @date:  2023/11/18** @author:叫牌** @brief: 设置坐标轴自适应** @param _flag: true表示自适应,false表示不自适应** @return: 无*/void SetAxisRanges(const bool& _flag);/*!* @func:  void SetLegendVisiable(const bool& _flag);** @date:  2023/11/18** @author:叫牌** @brief: 设置图例显隐** @param _flag: true表示显示,false表示隐藏** @return: 无*/void SetLegendVisiable(const bool& _flag);/*!* @func:  void SetRubberBand(const bool& _hor, const bool& _ver);** @date:  2023/11/18** @author:叫牌** @brief: 设置垂直或水平缩放** @param _hor: true表示打开水平缩放,false表示关闭* @param _ver: true表示打开垂直缩放,false表示关闭** @return: 无* * @note: 垂直和水平缩放只能打开一个,都打开默认选择水平缩放*/void SetRubberBand(const bool& _hor, const bool& _ver);private:QChartView* chart_view_;QChart* chart_;// X轴范围QValueAxis* x_axis_;// Y轴范围QValueAxis* y_axis_;// 存放所有的曲线// <曲线名称,对应的曲线指针>std::unordered_map<std::string, QLineSeries*> charts_series_;// 曲线数据的X和Y最小值QPoint axis_min_;// 曲线数据的X和Y轴最大值QPoint axis_max_;// 坐标轴是否自适应bool is_adaption_;// 图例是否显隐bool is_legend_;
};

我封装了接口供外部直接调用。

构造函数

CurveCharts::CurveCharts(QWidget* parent): QWidget(parent), chart_view_(new QChartView), chart_(new QChart), x_axis_(new QValueAxis), y_axis_(new QValueAxis), is_adaption_(false), is_legend_(false)
{// 布局,栅格布局,把QChartView对象之间放进去,在main函数实例化对象调用show方法。QGridLayout* layout = new QGridLayout;this->setLayout(layout);layout->addWidget(chart_view_);// 窗口标题setWindowTitle(StdString2QString("曲线视图"));// 设置QChartchart_view_->setChart(chart_);// 设置X和Y坐标轴标题的显示位置,X轴标题在最小面,Y轴标题在左侧chart_->addAxis(x_axis_, Qt::AlignBottom);chart_->addAxis(y_axis_, Qt::AlignLeft);// 用于平滑图形的边缘和曲线,减少锯齿状的边缘chart_view_->setRenderHint(QPainter::Antialiasing);// 初始化最小最大值,方便记录X轴和Y轴所有曲线数据的最大最小值axis_min_.setX(INT_MAX);axis_min_.setY(INT_MAX);axis_max_.setX(INT_MIN);axis_max_.setY(INT_MIN);
}

构造函数里对各种成员变量初始化,进行布局,将QChartView对象通过栅格布局,设置X和Y轴的标题。

AddSeries方法

bool CurveCharts::AddSeries(const std::string& _series_name, QPen _series_pen)
{// 如果找到了就说明这个曲线的名称已经添加过了,不能重复添加或者覆盖if (charts_series_.find(_series_name) != charts_series_.end())return false;// 定义一个折线对象QLineSeries* line_series = new QLineSeries;charts_series_[_series_name] = line_series;// 添加到QChartchart_->addSeries(line_series);// 给这条折线添加颜色line_series->setPen(_series_pen);// 设置X轴line_series->attachAxis(x_axis_);// 设置Y轴line_series->attachAxis(y_axis_);// 设置这条折线的名字line_series->setName(StdString2QString(_series_name));// 为true表示显示图例if(is_legend_)chart_->legend()->markers(line_series)[0]->setLabel(StdString2QString(_series_name));return true;
}

这是一个添加曲线的函数,我们通过实例化该类的对象调用,参数就是你要添加曲线的名字,还有你想要它是什么颜色。

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

UpdateSeries方法

bool CurveCharts::UpdateSeries(const std::string& _series_name, std::vector<QPoint> _charts_data)
{// 找不到说明没有这条曲线if (charts_series_.find(_series_name) == charts_series_.end())return false;// 这是更新,所以得把之前这条曲线的数据清空charts_series_[_series_name]->clear();// 添加曲线数据,同时将最大最小值替换for (const auto& point : _charts_data){qreal y_min = point.y() < axis_min_.y() ? point.y() : axis_min_.y();qreal y_max = point.y() > axis_max_.y() ? point.y() : axis_max_.y();qreal x_min = point.x() < axis_min_.x() ? point.x() : axis_min_.x();qreal x_max = point.x() > axis_max_.x() ? point.x() : axis_max_.x();axis_min_.setX(x_min);axis_min_.setY(y_min);axis_max_.setX(x_max);axis_max_.setY(y_max);charts_series_[_series_name]->append(point.x(), point.y());}// 如果是坐标轴自适应数据,那就通过设置坐标轴范围进行设置if (is_adaption_){SetXAxisRange(axis_min_.x(), axis_max_.x());SetYAxisRange(axis_min_.y(), axis_max_.y());}return true;
}

这是更新曲线数据,所谓更新就是把之前的清空,是新一份数据,参数是要更新的曲线名称和数据。

AppendSeriesData方法

bool CurveCharts::AppendSeriesData(const std::string& _series_name, std::vector<QPoint> _chart_data)
{if (charts_series_.find(_series_name) == charts_series_.end())return false;for (const auto& point : _chart_data){qreal y_min = point.y() < axis_min_.y() ? point.y() : axis_min_.y();qreal y_max = point.y() > axis_max_.y() ? point.y() : axis_max_.y();qreal x_min = point.x() < axis_min_.x() ? point.x() : axis_min_.x();qreal x_max = point.x() > axis_max_.x() ? point.x() : axis_max_.x();axis_min_.setX(x_min);axis_min_.setY(y_min);axis_max_.setX(x_max);axis_max_.setY(y_max);charts_series_[_series_name]->append(point.x(), point.y());}if (is_adaption_){SetXAxisRange(axis_min_.x(), axis_max_.x());SetYAxisRange(axis_min_.y(), axis_max_.y());}return true;
}

追加曲线数据,我们需要在外部给某条曲线数据追加时,和更新的区别在于更新需要清空,而追加不需要,沿用之前的数据。

SetLegendVisiable

void CurveCharts::SetLegendVisiable(const bool& _flag)
{is_legend_ = _flag;if (is_legend_){for (auto it = charts_series_.begin(); it != charts_series_.end(); it++)chart_->legend()->markers(it->second)[0]->setLabel(StdString2QString(it->first));}
}

设置是否显示图例,true表示显示,false表示不显示

SetRubberBand

void CurveCharts::SetRubberBand(const bool& _hor, const bool& _ver)
{if (_hor)chart_view_->setRubberBand(QChartView::HorizontalRubberBand);else if (_ver)chart_view_->setRubberBand(QChartView::VerticalRubberBand);
}

设置垂直缩放和水平缩放,但是这两个只能生效一个,不能同时生效。

剩下的方法就很简单,不做说明,直接贴源码。

CPP内容

#include "curve_charts.h"CurveCharts::CurveCharts(QWidget* parent): QWidget(parent), chart_view_(new QChartView), chart_(new QChart), x_axis_(new QValueAxis), y_axis_(new QValueAxis), is_adaption_(false), is_legend_(false)
{// 布局,栅格布局,把QChartView对象之间放进去,在main函数实例化对象调用show方法。QGridLayout* layout = new QGridLayout;this->setLayout(layout);layout->addWidget(chart_view_);// 窗口标题setWindowTitle(StdString2QString("曲线视图"));// 设置QChartchart_view_->setChart(chart_);// 设置X和Y坐标轴标题的显示位置,X轴标题在最小面,Y轴标题在左侧chart_->addAxis(x_axis_, Qt::AlignBottom);chart_->addAxis(y_axis_, Qt::AlignLeft);chart_view_->setRenderHint(QPainter::Antialiasing);// 初始化最小最大值,方便记录X轴和Y轴所有曲线数据的最大最小值axis_min_.setX(INT_MAX);axis_min_.setY(INT_MAX);axis_max_.setX(INT_MIN);axis_max_.setY(INT_MIN);
}CurveCharts::~CurveCharts()
{}bool CurveCharts::AddSeries(const std::string& _series_name, QPen _series_pen)
{// 如果找到了就说明这个曲线的名称已经添加过了,不能重复添加或者覆盖if (charts_series_.find(_series_name) != charts_series_.end())return false;// 定义一个折线对象QLineSeries* line_series = new QLineSeries;charts_series_[_series_name] = line_series;// 添加到QChartchart_->addSeries(line_series);// 给这条折线添加颜色line_series->setPen(_series_pen);// 设置X轴line_series->attachAxis(x_axis_);// 设置Y轴line_series->attachAxis(y_axis_);// 设置这条折线的名字line_series->setName(StdString2QString(_series_name));// 为true表示显示图例if(is_legend_)chart_->legend()->markers(line_series)[0]->setLabel(StdString2QString(_series_name));return true;
}bool CurveCharts::UpdateSeries(const std::string& _series_name, std::vector<QPoint> _charts_data)
{// 找不到说明没有这条曲线if (charts_series_.find(_series_name) == charts_series_.end())return false;// 这是更新,所以得把之前这条曲线的数据清空charts_series_[_series_name]->clear();// 添加曲线数据,同时将最大最小值替换for (const auto& point : _charts_data){qreal y_min = point.y() < axis_min_.y() ? point.y() : axis_min_.y();qreal y_max = point.y() > axis_max_.y() ? point.y() : axis_max_.y();qreal x_min = point.x() < axis_min_.x() ? point.x() : axis_min_.x();qreal x_max = point.x() > axis_max_.x() ? point.x() : axis_max_.x();axis_min_.setX(x_min);axis_min_.setY(y_min);axis_max_.setX(x_max);axis_max_.setY(y_max);charts_series_[_series_name]->append(point.x(), point.y());}// 如果是坐标轴自适应数据,那就通过设置坐标轴范围进行设置if (is_adaption_){SetXAxisRange(axis_min_.x(), axis_max_.x());SetYAxisRange(axis_min_.y(), axis_max_.y());}return true;
}bool CurveCharts::AppendSeriesData(const std::string& _series_name, std::vector<QPoint> _chart_data)
{if (charts_series_.find(_series_name) == charts_series_.end())return false;for (const auto& point : _chart_data){qreal y_min = point.y() < axis_min_.y() ? point.y() : axis_min_.y();qreal y_max = point.y() > axis_max_.y() ? point.y() : axis_max_.y();qreal x_min = point.x() < axis_min_.x() ? point.x() : axis_min_.x();qreal x_max = point.x() > axis_max_.x() ? point.x() : axis_max_.x();axis_min_.setX(x_min);axis_min_.setY(y_min);axis_max_.setX(x_max);axis_max_.setY(y_max);charts_series_[_series_name]->append(point.x(), point.y());}if (is_adaption_){SetXAxisRange(axis_min_.x(), axis_max_.x());SetYAxisRange(axis_min_.y(), axis_max_.y());}return true;
}void CurveCharts::SetTitle(const std::string& _title)
{chart_->setTitle(StdString2QString(_title));
}std::string CurveCharts::GetTitle()
{return QString2StdString(chart_->title());
}void CurveCharts::SetXAxisRange(qreal _x_min, qreal _x_max)
{x_axis_->setRange(_x_min, _x_max);
}void CurveCharts::SetYAxisRange(qreal _y_min, qreal _y_max)
{y_axis_->setRange(_y_min, _y_max);
}void CurveCharts::setAxisTitles(const std::string& _XTitle, const std::string& _YTitle)
{x_axis_->setTitleText(StdString2QString(_XTitle));y_axis_->setTitleText(StdString2QString(_YTitle));
}void CurveCharts::SetRubberBand(const bool& _hor, const bool& _ver)
{if (_hor)chart_view_->setRubberBand(QChartView::HorizontalRubberBand);else if (_ver)chart_view_->setRubberBand(QChartView::VerticalRubberBand);
}void CurveCharts::SetAxisRanges(const bool& _flag)
{is_adaption_ = _flag;
}void CurveCharts::SetLegendVisiable(const bool& _flag)
{is_legend_ = _flag;if (is_legend_){for (auto it = charts_series_.begin(); it != charts_series_.end(); it++)chart_->legend()->markers(it->second)[0]->setLabel(StdString2QString(it->first));}
}

测试函数

#include <QtWidgets/QApplication>
#include <QTimer>
#include <random>#include "curve_charts.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);CurveCharts* cure_charts = new CurveCharts;cure_charts->SetTitle("信号曲线");cure_charts->AddSeries("时域", QPen(QColor(Qt::green)));cure_charts->AddSeries("频域", QPen(QColor(Qt::red)));cure_charts->SetAxisRanges(true);cure_charts->SetLegendVisiable(true);cure_charts->SetRubberBand(true, false);cure_charts->setAxisTitles("时间", "幅度");int x = 0;QTimer timer;timer.setInterval(1000); // 设置定时间隔QObject::connect(&timer, &QTimer::timeout, [&]() {std::random_device rd;  // 随机设备,用于产生随机数种子std::mt19937 gen(rd()); // 使用随机设备的随机数引擎std::uniform_int_distribution<int> dist(0, 100); // 定义随机数分布范围为 [0, 100]std::vector<QPoint> temp1;std::vector<QPoint> temp2;int randomNumber1 = dist(gen);int randomNumber2 = dist(gen);QPoint point;point.setX(x);point.setY(randomNumber1);temp1.emplace_back(point);point.setY(randomNumber2);temp2.emplace_back(point);cure_charts->AppendSeriesData("时域", temp1);cure_charts->AppendSeriesData("频域", temp2);x++;});timer.start();cure_charts->show();return a.exec();
}

在测试代码中,我们添加了两条曲线,定义了一个定时器,间隔为1秒,每次产生两个0~100的随机值代表两条曲线的Y值,X值是时间。

另外,QChart支持设置背景色、十字线之类的效果,可以自己div。

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

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

相关文章

广西南宁新能源汽车电机定子三维扫描3D尺寸测量检测-CASAIM中科广电

一、背景介绍 电机定子压圈是一种用于电机上对电机定子的两端进行固定的辅助装置&#xff0c;在电机制造业中&#xff0c;电机定子制造的工艺水平往往能够直接决定电机制造的性能质量。而传统电机定子检测主要通过三坐标测量以及人工卡尺测量两种测量方式&#xff0c;三坐标每…

在Vue3中使用Element-Plus分页(Pagination )组件

开发过程中数据展示会经常使用到&#xff0c;同时分页功能也会添加到页面中。 记&#xff1a;在Vue3中使用Element-Plus分页组件与表格数据实现分页交互。 开始实现 引入表格和分页组件的H5标签。 <strong>Element-Plus分页组件使用</strong> <div><el-t…

【LeetCode刷题】--9.回文数

9.回文数 class Solution {public boolean isPalindrome(int x) {if(x < 0){return false;}int tmp x, sum 0;boolean flag false;while(x ! 0){sum sum * 10 x % 10;x / 10;}if(sum tmp){flag true;}return flag;} }

nvm的下载与使用

1.如果已经安装nodejs , 先卸载nodejs; 从控制面板中 卸载程序 卸载nodejs win r打开cmd ,管理员运行 where node 查看是否删除干净nodejs 2.下载nvm 从github 下载nvm , 下载nvm 3.nvm 和node安装路径最好写在同一个路径下 &#xff0c;如D盘 ,D\a\nvm , D\a\nodejs 4.…

算法之路(二)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 算法小能手 &#x1f606;今日分享 : 你知道北极熊的皮肤是什么颜色的吗&#xff1f;&#xff08;文章结尾有答案哦&#xff01;&#xff09; 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路&#xff1a…

单链表相关面试题--3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

/* 解题思路&#xff1a; 通过快慢指针找到中间节点&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff0c;当快指针走到结尾的时候&#xff0c;慢指针正好走到中间位置 */ typedef struct ListNode Node; struct ListNode* middleNode(struct ListNode* head)…

Vue3-provide 和 inject 跨组件传递数据

Vue3-provide 和 inject 跨组件传递数据 功能&#xff1a;将数据从App组件跨过一个组件传递到B组件中provide&#xff1a;提供数据inject&#xff1a;接收数据 // App.vue <template><h2>我是App组件&#xff08;{{num}}&#xff09;</h2><A></A&g…

服务器IPMI管理操作

简介&#xff1a;智能平台管理界面&#xff08;IPMI&#xff0c;Intelligent Platform Management Interface)是管理基于 Intel 结构的企业系统中所使用的外围设备采用的一种工业标准&#xff0c;用户可以利用IPMI监视服务器的物理健康特征&#xff0c;如温度、电压、风扇工作状…

马斯克回应OpenAI混乱:如果这关乎AI安全,那将影响整个地球

马斯克回应OpenAI混乱&#xff1a;如果这关乎AI安全&#xff0c;那将影响整个地球 2023-11-20 16:14秦丝进销存 近日&#xff0c;“马斯克回应ChatGPT之父被开除”登上热搜&#xff0c;特斯拉首席执行官马斯克曾与ChatGPT之父奥特曼一起创建OpenAI&#xff1b; 他在一篇”网友…

海康威视综合安防管理平台任意文件上传

系统介绍 HIKVISION iSecure Center综合安防管理平台是一套“集成化”、“智能化”的平台&#xff0c;通过接入视频监控、一卡通、停车场、报警检测等系统的设备&#xff0c;获取边缘节点数据&#xff0c;实现安防信息化集成与联动&#xff0c;公众号&#xff1a;web安全工具库…

《QT从基础到进阶·三十》QVariant的基础用法

很多时候&#xff0c;需要几种不同的数据类型需要传递&#xff0c;如果用结构体&#xff0c;又不大方便&#xff0c;容器保存的也只是一种数据类型&#xff0c;而QVariant则可以统统搞定。 QVariant可以保存QT和C常用类型&#xff0c;如果是自定义类型&#xff0c;比如struct,c…

【Django使用】django经验md文档10大模块。第4期:Django数据库增删改查

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能强大的第三方插件&#xff0c;你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展…

【计算机网络笔记】网络地址转换(NAT)

系列文章目录 系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08…

mongodb——概念介绍(文档,集合,固定集合,元数据,常用数据类型)

mongodb 层级结构 实例&#xff1a;系统上运行的进程及节点集&#xff0c;一个实例可以有多个库&#xff0c;默认端口 27017。 库&#xff1a;多个集合组成数据库&#xff0c;每个数据库都是独立的&#xff0c;有自己的用户、权限信息&#xff0c;独立的存储文件集 合。 集合&…

QT 使用mysql

版本&#xff1a;ubuntu&#xff1a;20.04.1 mysql&#xff1a; 8.0.35 QT &#xff1a;5.12.8 1.安装mysql sudo apt install mysql-server 下载完后查看mysql状态 sudo service mysql status 如下图active&#xff08;running&#xff09;则下载成功&#xff0c;运行中…

ExcelBDD PHP Guideline

在PHP里面支持利用Excel的BDD&#xff0c;也支持利用Excel进行参数化测试 ExcelBDD Use Excel file as BDD feature file, get example data from Excel files, support automation tests. Features The main features provided by this library are: Read test data acco…

思伟老友记 | 厦门路桥翔通海砼建材有限公司与思伟软件携手走过23年

23年 感恩相伴 携手成长 2001年-2023年&#xff0c;厦门路桥翔通海砼建材有限公司已携手上海思伟软件有限公司走过23年。从最初的半手动生产模式到如今的自动生产一体化系统&#xff0c;海砼公司通过思伟软件生产混凝土累计超过1000万m&#xff0c;思伟软件则借助海砼公司的实…

二百零六、Flume——Flume1.9.0单机版部署脚本(附截图)

一、目的 在实际项目部署时&#xff0c;要实现易部署易维护&#xff0c;需要把安装步骤变成安装脚本实现快速部署 二、部署脚本在Linux中文件位置 文件夹中只有脚本文件flume-install.sh和tar包apache-flume-1.9.0-bin.tar.gz 三、Flume安装脚本 #!/bin/bash #获取服务器名…

竞赛 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

安防视频监控平台EasyCVR服务器部署后出现报错,导致无法级联到域名服务器,该如何解决?

视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;安防监控平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视频定时轮播。视频监控…