Qt 三维柱状图 Q3DBar 和 三维条形图中的数据序列 QBar3DSeries

news2024/9/23 23:25:02

(一) 使用 Q3DBars 图形类和 QBar3DSeries 序列类可以绘制三维柱状图

窗口右侧是用 Q3DBars 和 QBar3DSeries 绘制的三维柱状图,这个图只有一个QBar3DSeries序列,数据是按行存储的,可以有多行。水平方向是行坐标轴和列坐标轴,使用OCategory3DAxis 坐标轴类;垂直方向是数值坐标轴,使用 QValue3DAxis 坐标轴类。在图上点击一个棒柱时,可以在图上显示其行标签、列标签和数值,状态栏上还会显示其行编号、列编号和数值。无须额外编程或设置,在图上按住鼠标右键并上下左右拖动鼠标可以进行水平和垂直方向的旋转,滚动鼠标滚轮可以进行缩放。 窗口工具栏上的按钮用于修改棒柱的基本颜色,修改选中棒柱的数值,添加、插入或删除行等。 窗口左侧是操作面板,分为多个分组框。

  • “旋转和平移”分组框。可以选择预设的三维图观察视角,可以通过 QSlider 组件进行水平旋转、垂直旋转和缩放。
  • 分组框里的4个方向按钮用于使三维柱状图在4个方向上平移,中间的按钮用于复位视角。
  • “图形总体”分组框。用于设置三维图形的主题、标签字体大小、棒柱选择模式,以及设置三维图形的各种元素的可见性和显示效果等。
  • “序列设置”分组框。设置序列的一些属性,如棒柱的样式、光滑效果等。

效果图:
在这里插入图片描述

(二) 3D部件创建及添加到窗口

1 添加三维图Q3DBars 三维图的容器QWidget和三维条形图中的数据序列QBar3DSeries

private:
    QWidget* graphContainer;        //三维图的容器
    Q3DBars* graph3D;               //三维图
    QBar3DSeries* series;           //三维条形图中的数据序列

2 初始化 3D部件并添加到窗口

void mainwindow::iniGraph3D()
{
    graph3D = new Q3DBars();            //创建三维图
    graphContainer = QWidget::createWindowContainer(graph3D, this);//Q3DBars继承自QWindow
    graph3D->scene()->activeCamera()    //设置视角
                ->setCameraPreset(Q3DCamera::CameraPresetFrontHigh); 

    //设置 Z坐标轴
    QValue3DAxis* axisV = new QValue3DAxis; //数值坐标
    axisV->setTitle(QString::fromLocal8Bit("销量"));
    axisV->setTitleVisible(true);
    axisV->setLabelFormat("%d");
    graph3D->setValueAxis(axisV);  			 //设置数值坐标轴

    //设置 X坐标轴
    QCategory3DAxis* axisRow = new QCategory3DAxis;
    axisRow->setTitle("row axis");
    axisRow->setTitleVisible(true);
    graph3D->setRowAxis(axisRow);  			 //设置行坐标轴

    //设置 Y坐标轴
    QCategory3DAxis* axisCol = new QCategory3DAxis;
    axisCol->setTitle("column axis");
    axisCol->setTitleVisible(true);
    graph3D->setColumnAxis(axisCol);		//设置列坐标轴

    //创建序列
    series = new QBar3DSeries;
    series->setMesh(QAbstract3DSeries::MeshCylinder);       //棒柱形状
    series->setItemLabelFormat("(@rowLabel,@colLabel): %d");//项的标签显示格式
    graph3D->addSeries(series);

    //设置数据代理的数据
    QBarDataArray* dataArray = new QBarDataArray; //棒柱数据数组,typedef QList<QBarDataRow *> QBarDataArray;
    for (int i = 0; i <3; i++)   			  //行
    {
        QBarDataRow* dataRow = new QBarDataRow;   //棒柱数据行,typedef QList<QBarDataItem> QBarDataRow;
        for (int j = 1; j <= 5; j++)          //列
        {
            quint32 value = rand()%15+1;          //随机整数[1,15]
            QBarDataItem* dataItem = new QBarDataItem;//创建棒柱数据对象
            dataItem->setValue(value);            //设置棒柱的数据
            dataRow->append(*dataItem);           //添加到棒柱数据行
        }
        dataArray->append(dataRow);               //棒柱数据数组添加一个棒柱数据行
    }


    QStringList rowLabs;    //行坐标标签
    rowLabs << "Week1" << "Week2" << "Week3";
    series->dataProxy()->setRowLabels(rowLabs); //设置数据代理的行标签

    QStringList colLabs;    //列坐标标签
    colLabs << "Mon" << "Tue" << "Wed" << "Thur" << "Fri";
    series->dataProxy()->setColumnLabels(colLabs);//设置数据代理的列标签

    series->dataProxy()->resetArray(dataArray);   //重设数据代理的数据

    connect(series, &QBar3DSeries::selectedBarChanged,
             this, &mainwindow::do_barSelected);
}

2-1 设置项标签格式

如果没有为该系列显式设置数据代理,则该系列将创建默认代理。设置另一个代理将销毁现有代理以及添加到其中的所有数据。

标签格式注释
@rowTitle来自行轴的标题
@colTitle列轴的标题
@valueTitle来自值轴的标题
@rowIdx可见行索引,使用图形区域设置进行了本地化
@colIdx可见列索引,使用图形区域设置进行了本地化
@rowLabel来自行轴的标签
@colLabel来自列轴的标签
@valueLabel使用附加到图形的值轴格式格式化的项值
@seriesName系列的名称
%<format spec>指定格式的项值。使用与QValue3DAxis::abelFormat相同的规则进行格式化

3 选中棒柱

void mainwindow::do_barSelected(const QPoint& position)
{
    if (position.x() < 0 || position.y() < 0)  //必须加此判断
    {
        ui->actBar_ChangeValue->setEnabled(false);
        return;
    }

    ui->actBar_ChangeValue->setEnabled(true);
    const QBarDataItem* bar = series->dataProxy()->itemAt(position);
    QString info = QString::fromLocal8Bit("选中的棒柱,Row=%1, Column=%2, Value=%3")
        .arg(position.x()).arg(position.y()).arg(bar->value());
    ui->statusBar->showMessage(info);
}

(三) 3D部件创建及添加到窗口

1 序列颜色 - 设置序列基本颜色

void mainwindow::on_actSeries_BaseColor_triggered()
{
    //设置序列基本颜色
    QColor  color = series->baseColor();
    color = QColorDialog::getColor(color);
    if (color.isValid())
    {
		series->setBaseColor(color);
	}        
}

2 重新生成 - 重新生成数据画图

void mainwindow::on_actRedraw_triggered()
{
    QBarDataProxy* dataProxy = new QBarDataProxy;    //新建数据代理
    int rowCount = series->dataProxy()->rowCount();  //数据代理的行数
    for (int i = 0; i < rowCount; i++)  //行
    {
        QBarDataRow* dataRow = new QBarDataRow;       //棒柱数据行
        for (int j = 1; j <= 5; j++)     //列
        {
            quint32 value = rand() % (15 - 5 + 1) + 5;
            QBarDataItem* dataItem = new QBarDataItem;   //数据项
            dataItem->setValue(value);
            dataRow->append(*dataItem);
        }
        QString rowStr = QString::fromLocal8Bit("第%1周").arg(i + 1);
        dataProxy->addRow(dataRow, rowStr);     //添加行数据和标签
    }

    QStringList colLabs = series->dataProxy()->columnLabels();    //原来的列坐标轴标签
    dataProxy->setColumnLabels(colLabs);

    series->dataProxy()->resetArray();  //清除数据代理和坐标轴标签,必须清除,否则不能重新设置坐标轴标签
    series->setDataProxy(dataProxy);    //重新设置数据代理,会删除之前的数据代理
}

3 修改数值 - 修改选中棒柱的数值(F2)

void mainwindow::on_actBar_ChangeValue_triggered()
{
    QPoint position = series->selectedBar();
    if (position.x() < 0 || position.y() < 0)   //必须加此判断
        return;

    QBarDataItem bar = *(series->dataProxy()->itemAt(position));
    qreal value = bar.value();    //原来的值

    bool ok;
    value = QInputDialog::getInt(this, QString::fromLocal8Bit("输入数值"),
                                       QString::fromLocal8Bit("更改棒柱数值"), value, 0, 50, 1, &ok);
    if (ok)
    {
        bar.setValue(value);
        series->dataProxy()->setItem(position, bar);
    }
}

4 添加行 - 添加一行

void mainwindow::on_actData_Add_triggered()
{
    //添加行
     const QString rowLabel = QInputDialog::getText(this,
                                 QString::fromLocal8Bit("输入字符串"),
                                 QString::fromLocal8Bit("请输入行标签"));

    if (rowLabel.isEmpty())
        return;

    QBarDataRow* dataRow = new QBarDataRow;       //棒柱数据行
    for (int j = 1; j <= 5; j++)     //固定5列
    {
        quint32 value = rand()%(25 - 15 + 1) + 15;
        QBarDataItem* dataItem = new QBarDataItem;
        dataItem->setValue(value);
        dataRow->append(*dataItem);
    }
    series->dataProxy()->addRow(dataRow, rowLabel);     //添加棒柱数据行和标签

  
}

5 插入行 - 插入一行

void mainwindow::on_actData_Insert_triggered()
{
    //插入行
    QString rowLabel = QInputDialog::getText(this, QString::fromLocal8Bit("输入字符串"), 
                                                   QString::fromLocal8Bit("请输入行标签"));
    if (rowLabel.isEmpty())
        return;
  

    QPoint position = series->selectedBar();
    int index = position.x(); //当前行号
    if (index < 0)
        index = 0;

    QBarDataRow* dataRow = new QBarDataRow;       //棒柱数据行
    for (int j = 1; j <= 5; j++)     //固定5列
    {
        quint32 value = rand() % (30 - 20) + 20; 
        QBarDataItem* dataItem = new QBarDataItem;
        dataItem->setValue(value);
        dataRow->append(*dataItem);
    }
    series->dataProxy()->insertRow(index, dataRow);    //插入棒柱数据行
    
}

6 删除行 - 删除当前行

void mainwindow::on_actData_Delete_triggered()
{

    QPoint position = series->selectedBar();
    if (position.x() < 0 || position.y() < 0)
        return;

    int rowIndex = position.x();  //当前行号
    int removeCount = 1;          //删除的行数
    int removeLabels = true;      //是否删除行标签
    series->dataProxy()->removeRows(rowIndex, removeCount, removeLabels);
}

7 退出 - 退出本程序

void mainwindow::on_actQiut_triggered()
{
    QApplication::quit();
}

(四) “旋转和平移”分组框功能

1 预设视角

void mainwindow::on_comboCamera_currentIndexChanged(int index)
{
    Q3DCamera::CameraPreset  cameraPos =  Q3DCamera::CameraPreset(index);
    graph3D->scene()->activeCamera()->setCameraPreset(cameraPos);
}

预设视角类型参考 enum Q3DCamera::CameraPreset

2 水平旋转

void mainwindow::on_sliderH_valueChanged(int value)
{
    graph3D->scene()->activeCamera()->setXRotation(value);
}

3 垂直旋转

void mainwindow::on_sliderV_valueChanged(int value)
{
    graph3D->scene()->activeCamera()->setYRotation(value);
}

4 缩放

void mainwindow::on_sliderZoom_valueChanged(int value)
{
    graph3D->scene()->activeCamera()->setZoomLevel(value);
}

5 下移

void mainwindow::on_btnMoveDown_clicked()
{
    QVector3D target3D = graph3D->scene()->activeCamera()->target();
    qreal z = target3D.z();
    target3D.setZ(z + 0.1);
    graph3D->scene()->activeCamera()->setTarget(target3D);
}

6 上移

void mainwindow::on_btnMoveUp_clicked()
{
    QVector3D target3D = graph3D->scene()->activeCamera()->target();
    qreal z = target3D.z();
    target3D.setZ(z - 0.1);
    graph3D->scene()->activeCamera()->setTarget(target3D);
}

7 左移

void mainwindow::on_btnMoveLeft_clicked()
{
    QVector3D target3D = graph3D->scene()->activeCamera()->target();
    qreal x = target3D.x();
    target3D.setX(x + 0.1);
    graph3D->scene()->activeCamera()->setTarget(target3D);
}

8 右移

void mainwindow::on_btnMoveRight_clicked()
{
    QVector3D target3D = graph3D->scene()->activeCamera()->target();
    qreal x = target3D.x();
    target3D.setX(x - 0.1);
    graph3D->scene()->activeCamera()->setTarget(target3D);
}

9 复位(到 FrontHigh 视角)

void mainwindow::on_btnResetCamera_clicked()
{
    graph3D->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFrontHigh);

(五) “图形总体”分组框功能

1 显示选中棒柱的标签 CheckBox

void mainwindow::on_cBoxTheme_currentIndexChanged(int index)
{
    Q3DTheme* currentTheme = graph3D->activeTheme();
    currentTheme->setType(Q3DTheme::Theme(index));
}

2 轴标签字体大小

void mainwindow::on_spinFontSize_valueChanged(int arg1)
{
    QFont font = graph3D->activeTheme()->font();
    font.setPointSize(arg1);
    graph3D->activeTheme()->setFont(font);   
}

3 选择模式

void mainwindow::on_cBoxSelectionMode_currentIndexChanged(int index)
{
    graph3D->setSelectionMode(QAbstract3DGraph::SelectionFlags(index));
}

4 显示背景 CheckBox

void mainwindow::on_chkBoxBackground_clicked(bool checked)
{
    graph3D->activeTheme()->setBackgroundEnabled(checked);
}

4-1 选择模式

enum QAbstract3DGraph::SelectionFlag

枚举值含义
QAbstract3DGraph::SelectionNone不允许选择
QAbstract3DGraph::SelectionItem选择并且高亮显示一个项
QAbstract3DGraph::SelectionRow选择并且高亮显示一行
QAbstract3DGraph::SelectionItemAndRow选择一个项和一行,用不同颜色高亮显示
QAbstract3DGraph::SelectionColumn选择并且高亮显示一列
QAbstract3DGraph::SelectionItemAndColumn选择一个项和一列,用不同颜色高亮显示
QAbstract3DGraph::SelectionRowAndColumn选择交叉的一行和一列
QAbstract3DGraph::SelectionItemRowAndColumn选择交叉的一行和一列,用不同颜色高亮显示
QAbstract3DGraph::SelectionSlice切片选择,需要与 SelectionRow 或 SelectionColumn 结合使用
QAbstract3DGraph::SelectionMultiSeries选中同一个位置处的多个序列的项

5 显示背景网格 CheckBox

void mainwindow::on_chkBoxGrid_clicked(bool checked)
{
    graph3D->activeTheme()->setGridEnabled(checked);
}

6 显示倒影 CheckBox

void mainwindow::on_chkBoxReflection_clicked(bool checked)
{
    graph3D->setReflection(checked);
}

7 数值坐标轴反向 CheckBox

void mainwindow::on_chkBoxReverse_clicked(bool checked)
{
    graph3D->valueAxis()->setReversed(checked);
}

8 显示轴标题 CheckBox

void mainwindow::on_chkBoxAxisTitle_clicked(bool checked)
{
    graph3D->valueAxis()->setTitleVisible(checked);
    graph3D->rowAxis()->setTitleVisible(checked);
    graph3D->columnAxis()->setTitleVisible(checked);
}

9 显示轴标签背景 CheckBox

void mainwindow::on_chkBoxAxisBackground_clicked(bool checked)
{
    graph3D->activeTheme()->setLabelBackgroundEnabled(checked);
}

(六) “序列设置”分组框功能

1 棒柱样式 ComboBox

void mainwindow::on_cBoxBarStyle_currentIndexChanged(int index)
{
    QAbstract3DSeries::Mesh aMesh;
    aMesh = QAbstract3DSeries::Mesh(index + 1);  //0=MeshUserDefined
    series->setMesh(aMesh);
}

1-1 棒柱形状

enum QAbstract3DSeries::Mesh
并非所有样式都可用于所有可视化类型。

常量注释
QAbstract3DSeries::MeshUserDefined0用户定义网格,通过QAbstract3DSeries::userDefinedMesh属性设置
QAbstract3DSeries::MeshBar1基本矩形条
QAbstract3DSeries::MeshCube2基本多维数据集
QAbstract3DSeries::MeshPyramid3四边形金字塔
QAbstract3DSeries::MeshCone4基本圆锥体
QAbstract3DSeries::MeshCylinder5基本气缸
QAbstract3DSeries::MeshBevelBar6略微倾斜(圆形)的矩形钢筋
QAbstract3DSeries::MeshBevelCube7略微倾斜(圆形)的立方体
QAbstract3DSeries::MeshSphere8球体
QAbstract3DSeries::MeshMinimal9最小的三维网格:一个三角锥
QAbstract3DSeries::MeshArrow10向上的箭头
QAbstract3DSeries::MeshPoint112D点

2 光滑效果 CheckBox

void mainwindow::on_chkBoxSmooth_clicked(bool checked)
{
    series->setMeshSmooth(checked);
}

3 显示选中棒柱的标签 CheckBox

void mainwindow::on_chkBoxItemLabel_clicked(bool checked)
{
        series->setItemLabelFormat("value at (@rowLabel,@colLabel): %.1f");
        series->setItemLabelVisible(checked);
}

(七) 有关QBarDataProxy数据管理接口

函数功能
int addRow()添加一行数据,一行数据是 QBarDataRow 类型对象
void insertRow()在某行之前插入一行数据
void removeRows()从某行开始,移除指定行数的数据
void setRow ()为某一行重新设置一行数据
QBarDataRow *rowAt()返回某一行的数据
void setItem()根据行号和列号,设置某个棒柱数据项
QBarDataltem *itemAt()根据行号和列号,返回单个棒柱数据项
void resetArray()若不带任何参数,就清除数据代理所有的数据和标签;若使用一个 QBarDataArray类型的对象作为输入参数,就重新设置棒柱数据数组
int rowCount()返回数据代理的行数
void setRowLabels()用一个字符串列表设置行坐标轴的标签
StringList rowLabels()返回行坐标轴的所有标签
void setColumnLabels()用一个字符串列表设置列坐标轴的标签
QStringList columnLabels()返回列坐标轴的所有标签

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

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

相关文章

C++20新特性解析:深入探讨协程库的实现原理与应用

C20新特性解析&#xff1a;深入探讨协程库的实现原理与应用 一、C20的协程库简介二、C20协程基础知识2.1、协程的基本概念和使用方法2.2、C20中的协程支持2.3、协程与传统线程的对比 三、C20协程库的实现原理四、C20协程库的应用实例总结 一、C20的协程库简介 C20引入了对协程…

.NET学习教程一——.net基础定义+VS常用设置

一、定义 .NET分为.NET平台和.NET框架。 .NET平台&#xff08;厨房&#xff09;.NET FrameWork 框架&#xff08;柴米油盐酱醋茶&#xff09; .NET平台&#xff08;中国移动联通平台&#xff09;.NET FrameWork 框架&#xff08;信号塔&#xff09; .NET平台基于.NET Fra…

AutomationML 学习心得

断断续续地学习AutomationML&#xff08;下面简称AML&#xff09;&#xff0c;其内容很多。概念&#xff0c;术语与与其它建模语言有类似之处&#xff0c;也有不同。同时涉及了一大堆标准。 CAEX&#xff08;IEC 62424&#xff09;COLLADA 几何、动力学模型PLCopen XML 但是&a…

Windows下Redis5+可视化软件下载、安装和配置教程-2024年1月8日

Windows下Redis5下载、安装和配置教程-2024年1月8日 一、下载二、安装三、配置环境四、配置可视化客户端 一、下载 redis是现在是没有对win系统版进行维护的&#xff0c;这个是大神完成的&#xff0c;目前是到5版本&#xff0c;选择Redis-x64-5.0.14.1.zip点击下载 下载地址&…

Python Flask JinJa2 语法介绍与示例讲解

一、概述 Flask是一个轻量级的Python Web框架&#xff0c;支持Jinja2模板引擎。Jinja2是一个流行的Python模板引擎&#xff0c;它可以使用Flask来创建动态Web应用程序。 web 页面一般需要html、css和js&#xff0c;可能最开始学习python web的时候可能这样写&#xff1a; fr…

SpringBoot+策略模式实现多种文件存储模式

一、策略模式 背景 针对某种业务可能存在多种实现方式&#xff1b;传统方式是通过传统if…else…或者switch代码判断&#xff1b; 弊端&#xff1a; 代码可读性差扩展性差难以维护 策略模式简介 策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行…

4.6 BOUNDARY CHECKS

我们现在扩展了tile矩阵乘法内核&#xff0c;以处理具有任意宽度的矩阵。扩展必须允许内核正确处理宽度不是tile宽度倍数的矩阵。通过更改图4.14中的示例至33 M、N和P矩阵&#xff0c;图4.18创建了矩阵的宽度为3&#xff0c;不是tile宽度&#xff08;2&#xff09;的倍数。图4.…

服务器宕机怎么办?怎么预防宕机?

相信不少用户会听到或者在文章中提到电脑宕机或者服务器宕机&#xff0c;不少用户对宕机的意思不太理解。那么服务器宕机是什么意思&#xff1f; 宕机属于计算机的术语&#xff0c;指电脑或者服务器不能正常工作。口语中我们简单的把停掉机器叫做down机&#xff0c;转换为汉字是…

九、分布式锁 —— 超详细操作演示!!!

九、分布式锁 —— 超详细操作演示&#xff01; 九、分布式锁9.1 分布式锁的工作原理9.2 问题引入9.2.1 场景9.2.2 实现9.2.3 分析 9.3 setnx 实现方式9.3.1 原理9.3.2 实现9.3.3 问题 9.4 为锁添加过期时间9.4.1 原理9.4.2 实现9.4.3 问题 9.5 为锁添加标识9.5.1 原理9.5.2 实…

揭秘阿里自研搜索引擎 Havenask 在线检索服务

作者&#xff1a;谷深 Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎&#xff0c;深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 的在线服务&#xff0c;它具备高可用、高时效、低成本的优势&#xff0c;…

计算机网络学习笔记(四)

文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别&#xff1f;5.302和304有什么区别&#xff1f;6. 请描述一次完整的HTTP请求的过程。7.什么是重定向&#xff1f;8. 重定向和请求转发有什么区别&#xff1f;9.介绍…

电子学会C/C++编程等级考试2023年12月(四级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁…

如何让ArcGIS Pro启动显示空白页面

刚接触ArcGIS Pro的你是否会觉得在操作上有那么一些不习惯&#xff0c;从一开始软件启动就发现和ArcGIS差距很大&#xff1a;丰富的欢迎页面&#xff0c;加上默认加载的地图让你眼花缭乱&#xff0c;这里教你如何去掉这些繁杂的内容&#xff0c;还你一个干净的启动页面。 跳过…

2024年远控软件年度盘点:安全、稳定、功能之选

这目录 前言2024年热门远控软件ToDesk向日葵TeamViewerAnyDeskSplashtopAirDroidChrome Remote DesktopMicrosoft远程桌面RayLinkParallels Access 远程控制软件如何选择&#xff1f;1、功能性2、安全性3、易用性4、稳定性 未来展望与建议结语 前言 随着信息技术不断发展&…

setup 语法糖

只有vue3.2以上版本可以使用 优点&#xff1a; 更少的样板内容&#xff0c;更简洁的代码 能够使用纯 Typescript 声明props 和抛出事件 更好的运行时性能 更好的IDE类型推断性能 在sciprt标识上加上setup 顶层绑定都可以使用 不需要return &#xff0c;可以直接使用 使用组件…

java多线程-实现多线程(一)

目录 1.1 进程 1.2 线程 1.3 多线程的实现方式 ​编辑 方式1&#xff08;继承Thread类&#xff09; 1.1 进程 是正在运行的程序是系统进行资源分配和调用的独立单位每一个进程都有它自己的内存空间和系统资源 1.2 线程 线程是进程中的单个顺序控制流&#xff0c;是一条执…

802.1X(HCIP)

目录 一、802.1X协议概述 1、802.1X协议概述 2、802.1X基本概念 认证模式 认证方式 端口控制方式 3、802.1X认证触发机制 客户端主动触发 设备端主动触发&#xff08;用于支持不能主动发送EAPOL-Start报文的客户端&#xff09; 4、EAP体系结构 5、EAP报文封装结构 6…

基于Django框架的旅游推荐系统构建-计算机毕业设计源码82884

摘 要 随着社会的快速发展和人们生活水平的不断提高&#xff0c;旅游已逐渐成为人们生活的重要组成部分&#xff0c;用户能够获取旅游信息的渠道也随信息技术的广泛应用而增加。大量未经过滤的信息在展示给用户的同时&#xff0c;也淹没了用户真正感兴趣的信息。为了方便用户快…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释&#xff08;主题&#xff09;★ 主题★ 分区★ 创建主题&#xff1a;★ 列出和查看主题 CMAK 各个功能的作用解释&#xff08;主题&#xff09; ★ 主题 Kafka 主题虽然也叫 topic&#xff0c;但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

通义千问协助分析openHarmony内核编译故障记录

drivers/hdf/khdf/manager/../../../..//framework/utils/src/hdf_sbuf.c:271:6: 错误&#xff1a; ‘-mgeneral-regs-only’ is incompatible with floating-point argument 这个编译错误提示指出&#xff0c;在编译源文件 "hdf_sbuf.c"&#xff08;位于 "driv…