QTableView自定义拖拽行_qtableview拖拽-程序员宅基地

技术标签: C++  c++  Qt  qt5  QTableView  

实现QTableView的行拖拽,支持多行选择拖拽,也可根据需要稍作修改实现QTreeView、QListView等的拖拽效果。

拖拽类实现

继承 QTableView 实现几个拖拽相关的方法
TableView.h

#ifndef TableView_H
#define TableView_H

#include <QObject>
#include <QListView>
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include <QDragLeaveEvent>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QMimeData>
#include <QDrag>
#include <QDebug>
#include <QTableView>

class TableView : public QTableView
{
    
    Q_OBJECT

public:
    explicit TableView(QWidget *parent = nullptr);

    bool isDraging() const {
    return IsDraging;}
    int offset() const {
    return 12;}
    int highlightedRow() const {
    return curHighlightedRow;}
    int dragRow() const {
    return curDragRow;}
    static QString myMimeType() {
     return QStringLiteral("TableView/text-icon"); }
private:
    //dropIndicator显示与消失
    void updateDropIndicator(int row);
protected:
    void dragEnterEvent(QDragEnterEvent *event) override;
    void dragLeaveEvent(QDragLeaveEvent *event) override;
    void dragMoveEvent(QDragMoveEvent *event) override;
    void dropEvent(QDropEvent *event) override;
    void startDrag(Qt::DropActions supportedActions) override;

private:
    bool IsDraging = false;
    //当前鼠标所在位置 行号
    int curHighlightedRow = -2;
    //被拖拽的行所在的位置
    int oldHighlightedRow = -2;
    //拖拽的行
    int curDragRow = -1;
    //当前鼠标放下所在行
    int curInsertRow = -1;
    //需要删除的旧行(行号)
    QList<int> oldSelectRow;
    //选中的拖拽行
    QList<int> curDragRows;
};

bool compareBarData(const int &barAmount1, const int &barAmount2);

#endif // TableView_H

TableView.cpp

#include "TableView.h"

TableView::TableView(QWidget *parent) :
    QTableView(parent)
{
    
    setDragEnabled(true);
    setAcceptDrops(true);
    setEditTriggers(QAbstractItemView::NoEditTriggers);

    this->setStyleSheet(
        "QListView::Item{height:20px;}"
    );
    //列撑满整个表格
    this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    //去掉表格边框线
    this->setShowGrid(false);
    //整行选择
    this->setSelectionBehavior(QAbstractItemView::SelectRows);
    //按住ctrl多选
    this->setSelectionMode(QAbstractItemView::ExtendedSelection);
}

void TableView::dragEnterEvent(QDragEnterEvent *event)
{
    
    TableView *source = qobject_cast<TableView *>(event->source());
    if (source && source == this) {
    
        IsDraging = true;  //IsDraging(标志位)判断是否正在拖拽
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}

void TableView::dragLeaveEvent(QDragLeaveEvent *event)
{
    
    oldHighlightedRow = curHighlightedRow;
    curHighlightedRow = -2;
    //刷新以使dropIndicator消失,
    updateDropIndicator(oldHighlightedRow);
    IsDraging = false;
    curInsertRow = -1;
    event->accept();
}
//dropIndicator显示与消失
void TableView::updateDropIndicator(int row)
{
    
    //这里用的是update(QModelIndex),这里也可以使用update(QRect),在表格所有列绘制分隔符
    for (int updateColI = 0; updateColI < this->model()->columnCount();updateColI++) {
    
        //刷新新区域使dropIndicator显示
        update(model()->index(row, updateColI));
        update(model()->index(row + 1, updateColI));
    }
}
void TableView::dragMoveEvent(QDragMoveEvent *event)
{
    
    TableView *source = qobject_cast<TableView *>(event->source());
    if (source && source == this) {
    
        oldHighlightedRow = curHighlightedRow;
        curHighlightedRow = indexAt(event->pos() - QPoint(0, offset())).row();

        //offset() = 9 = rowHeight / 2 - 1,其中 rowHeight 是行高
        if(event->pos().y() >= offset()){
    
            if(oldHighlightedRow != curHighlightedRow){
    
                //刷新以使dropIndicator消失
                updateDropIndicator(oldHighlightedRow);

                //刷新新区域使dropIndicator显示
                updateDropIndicator(curHighlightedRow);

            }else{
    
                //刷新新区域使dropIndicator显示
                updateDropIndicator(curHighlightedRow);
            }
            curInsertRow = curHighlightedRow + 1;
        }else{
    
            curHighlightedRow = -1;
            //刷新新区域使dropIndicator显示,第一行
            updateDropIndicator(0);

            curInsertRow = 0;
        }

        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}

void TableView::dropEvent(QDropEvent *event)
{
    
    TableView *source = qobject_cast<TableView *>(event->source());
    if (source && source == this){
    

        IsDraging = false;  //完成拖拽
        oldHighlightedRow = curHighlightedRow;
        curHighlightedRow = -2;

        //刷新以使dropIndicator消失
        updateDropIndicator(oldHighlightedRow);
        
        //这里我像QListWidget那样调用父类dropEvent(event)发现不起作用(原因尚不明),没办法,只能删除旧行,插入新行
        //从event->mimeData()取出拖拽数据
        QList<int> text;
        //                QIcon icon;
        QByteArray itemData = event->mimeData()->data(myMimeType());
        QDataStream dataStream(&itemData, QIODevice::ReadOnly);
        dataStream >> text;// >> icon;

        //[1]

        for (int rowI = 0;rowI < text.size();rowI++) {
    
            if(curInsertRow == text.at(rowI) || curInsertRow == text.at(rowI) + 1)
            {
    
                curDragRows.clear();
                return;
            }
        }

        qSort(text.begin(),text.end(),compareBarData);
        QList<QList<QStandardItem*>> standardItemRow;

        for (int rowI = 0;rowI < text.size();rowI++) {
    
            QList<QStandardItem*> standardItem;
            for (int i = 0;i < this->model()->columnCount();i++) {
    
                QModelIndex index = this->model()->index(text.at(rowI),i);
                QString name = this->model()->data(index).toString();
                standardItem.append(new QStandardItem(name));
                qDebug()<< "[" << __LINE__ << "-" << __FUNCTION__ << "]"<<name;
            }
            standardItemRow.append(standardItem);
        }

        for (int rowI = 0;rowI < text.size();rowI++) {
    
            model()->insertRow(curInsertRow+rowI);  //插入新行
            QStandardItemModel *listModel = qobject_cast<QStandardItemModel *>(model());
            for (int i = 0;i < this->model()->columnCount();i++) {
    
                listModel->setItem(curInsertRow+rowI, i, standardItemRow[rowI][i]);
            }
        }
        setCurrentIndex(model()->index(curInsertRow, 0));  //插入行保持选中状态
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}

/**!使用startDrag()则不需要判断拖拽距离,按下鼠标时触发
*/
void TableView::startDrag(Qt::DropActions)
{
    	
	//清空当前拖拽列表,防止重复拖拽选中
	curDragRows.clear();
	//当前拖拽行
    curDragRow = currentIndex().row();
    QStandardItemModel *listModel = qobject_cast<QStandardItemModel *>(model());
    QModelIndexList modelIndexList = this->selectionModel()->selectedRows();
    // 放入QMimeData容器中的拖拽数据(选中的行索引)
    QList<int> text;
    foreach (QModelIndex modelIndex, modelIndexList) {
    
    	//把当前拖拽数据放到拖拽列表中,实现后面拖拽完成删除旧的行
        curDragRows.append(modelIndex.row());
        //把拖拽数据的行索引放在QMimeData容器中
        text.append(modelIndex.row());
    }
    QByteArray itemData;
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    dataStream << text;

	//设置拖拽对象,可自动定义拖拽的缩略图样式可自己继承 QWidget 画一个出来
	/**QWidget* widget= new QWidget(this);
	widget->setupthumbnail(icon, text);
	QPixmap pixmap = widget->grab();
	drag->setPixmap(pixmap);
	drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));
	*/
    QMimeData *mimeData = new QMimeData;
    mimeData->setData(myMimeType(), itemData);
    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    
    //删除的行需要根据curInsertRow和curDragRow的大小关系来判断,大于当前放下的行需要加上放下的行数,小于当前放下的行则不需加
    if(drag->exec(Qt::MoveAction) == Qt::MoveAction){
    
        int sizecurDragRows = curDragRows.size();
        qSort(curDragRows.begin(),curDragRows.end(),compareBarData);
        int theRemoveRow = -1;
        for (int i = curDragRows.size()-1;i >= 0;i--) {
    
            if(curInsertRow < curDragRows.at(i)) theRemoveRow = curDragRows.at(i) + sizecurDragRows;
            else theRemoveRow = curDragRows.at(i);
            model()->removeRow(theRemoveRow);
            curDragRows.removeAt(i);
        }
    }
}
bool compareBarData(const int &barAmount1, const int &barAmount2)
{
    
    if (barAmount1 < barAmount2)//<升序排列,>降序排列
    {
    
        return true;
    }
    return false;
}

自定义拖拽分割符样式委托

TableItemDelegate.h

#ifndef TableItemDelegate_H
#define TableItemDelegate_H

#include <QObject>
#include <QPainter>
#include <QStyleOptionViewItem>
#include <QStyledItemDelegate>
#include <QModelIndex>
#include <QTableView>
#include <QDebug>
#include "TableView.h"

#define POLYGON 2   //分隔符等腰三角形直角边长
#define WIDTH 1     //分隔符粗细的一半

class TableItemDelegate : public QStyledItemDelegate
{
    
    Q_OBJECT
public:
    TableItemDelegate(QObject *parent = nullptr);

protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

#endif // TableItemDelegate_H

TableItemDelegate.cpp

#include "TableItemDelegate.h"

TableItemDelegate::TableItemDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{
    }
void TableItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
    
    TableView *dragView = qobject_cast<TableView *>(option.styleObject);
    bool isDraging = dragView->isDraging();

    QRect rect = option.rect;

    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->setPen(Qt::NoPen);

    if(option.state & (QStyle::State_MouseOver | QStyle::State_Selected)){
    
        if(option.state & QStyle::State_Selected){
    
            painter->setBrush(QColor(180, 0, 0));
            painter->drawRect(rect.topLeft().x(), rect.topLeft().y(), 4, rect.height());

            painter->setBrush(QColor(230, 231, 234));
            painter->drawRect(rect.topLeft().x() + 4, rect.topLeft().y(), rect.width() - 4, rect.height());
        }
    }
//开始绘制拖拽分隔符
    if(isDraging){
    
        int theDragRow = dragView->dragRow();
        int UpRow = dragView->highlightedRow();
        int DownRow = UpRow + 1;
        int rowCount = dragView->model()->rowCount() - 1;

//绘制DropIndicator
        if(index.row() == UpRow && index.row() != theDragRow - 1 && index.row() != theDragRow){
    
            painter->setBrush(QColor(0, 0, 0));

            if(UpRow == rowCount){
    
                //到控件达尾部行,三角形向上移动一个WIDTH的距离,以使分隔符宽度*2
                QPolygon triangle_polygon_bottomLeft;
                triangle_polygon_bottomLeft << QPoint(rect.bottomLeft().x(), rect.bottomLeft().y() - (POLYGON + WIDTH) + 1 - WIDTH);
                triangle_polygon_bottomLeft << QPoint(rect.bottomLeft().x(), rect.bottomLeft().y() - WIDTH + 1 - WIDTH);
                triangle_polygon_bottomLeft << QPoint(rect.bottomLeft().x() + POLYGON, rect.bottomLeft().y() - WIDTH + 1 - WIDTH);

                QPolygon triangle_polygon_bottomRight;
                triangle_polygon_bottomRight << QPoint(rect.bottomRight().x() + 1, rect.bottomRight().y() - (POLYGON + WIDTH) + 1 - WIDTH);
                triangle_polygon_bottomRight << QPoint(rect.bottomRight().x() + 1, rect.bottomRight().y() - WIDTH + 1 - WIDTH);
                triangle_polygon_bottomRight << QPoint(rect.bottomRight().x() - POLYGON + 1, rect.bottomRight().y() - WIDTH + 1 - WIDTH);

                painter->drawRect(rect.bottomLeft().x(), rect.bottomLeft().y() - 2 * WIDTH + 1, rect.width(), 2 * WIDTH);  //rect
                painter->drawPolygon(triangle_polygon_bottomLeft);
                painter->drawPolygon(triangle_polygon_bottomRight);
            }
            else {
    
                //正常情况,组成三角形上半部分(+1根据实际情况自定义)
                QPolygon triangle_polygon_bottomLeft;
                triangle_polygon_bottomLeft << QPoint(rect.bottomLeft().x(), rect.bottomLeft().y() - (POLYGON + WIDTH) + 1);
                triangle_polygon_bottomLeft << QPoint(rect.bottomLeft().x(), rect.bottomLeft().y() - WIDTH + 1);
                triangle_polygon_bottomLeft << QPoint(rect.bottomLeft().x() + POLYGON, rect.bottomLeft().y() - WIDTH + 1);

                QPolygon triangle_polygon_bottomRight;
                triangle_polygon_bottomRight << QPoint(rect.bottomRight().x() + 1, rect.bottomRight().y() - (POLYGON + WIDTH) + 1);
                triangle_polygon_bottomRight << QPoint(rect.bottomRight().x() + 1, rect.bottomRight().y() - WIDTH + 1);
                triangle_polygon_bottomRight << QPoint(rect.bottomRight().x() - POLYGON + 1, rect.bottomRight().y() - WIDTH + 1);

                painter->drawRect(rect.bottomLeft().x(), rect.bottomLeft().y() - WIDTH + 1, rect.width(), WIDTH);  //rect
                painter->drawPolygon(triangle_polygon_bottomLeft);
                painter->drawPolygon(triangle_polygon_bottomRight);

            }
        }
        else if(index.row() == DownRow && index.row() != theDragRow + 1 && index.row() != theDragRow){
    
            painter->setBrush(QColor(0, 0, 0));
            if(DownRow == 0){
    
                //到控件达头部行,三角形向下移动一个WIDTH的距离,以使分隔符宽度*2
                QPolygon triangle_polygon_topLeft;
                triangle_polygon_topLeft << QPoint(rect.topLeft().x(), rect.topLeft().y() + (POLYGON + WIDTH) + WIDTH);
                triangle_polygon_topLeft << QPoint(rect.topLeft().x(), rect.topLeft().y() + WIDTH + WIDTH);
                triangle_polygon_topLeft << QPoint(rect.topLeft().x() + POLYGON, rect.topLeft().y() + WIDTH + WIDTH);

                QPolygon triangle_polygon_topRight;
                triangle_polygon_topRight << QPoint(rect.topRight().x() + 1, rect.topRight().y() + (POLYGON + WIDTH) + WIDTH);
                triangle_polygon_topRight << QPoint(rect.topRight().x() + 1, rect.topRight().y() + WIDTH + WIDTH);
                triangle_polygon_topRight << QPoint(rect.topRight().x() - POLYGON + 1, rect.topRight().y() + WIDTH + WIDTH);

                painter->drawRect(rect.topLeft().x(), rect.topLeft().y(), rect.width(), 2 * WIDTH);  //rect
                painter->drawPolygon(triangle_polygon_topLeft);
                painter->drawPolygon(triangle_polygon_topRight);
            }
            else{
    
                //正常情况,组成三角形下半部分(+1根据实际情况自定义)
                QPolygon triangle_polygon_topLeft;
                triangle_polygon_topLeft << QPoint(rect.topLeft().x(), rect.topLeft().y() + (POLYGON + WIDTH));
                triangle_polygon_topLeft << QPoint(rect.topLeft().x(), rect.topLeft().y() + WIDTH);
                triangle_polygon_topLeft << QPoint(rect.topLeft().x() + POLYGON, rect.topLeft().y() + WIDTH);

                QPolygon triangle_polygon_topRight;
                triangle_polygon_topRight << QPoint(rect.topRight().x() + 1, rect.topRight().y() + (POLYGON + WIDTH));
                triangle_polygon_topRight << QPoint(rect.topRight().x() + 1, rect.topRight().y() + WIDTH);
                triangle_polygon_topRight << QPoint(rect.topRight().x() - POLYGON + 1, rect.topRight().y() + WIDTH);
                
                painter->drawRect(rect.topLeft().x(), rect.topLeft().y(), rect.width(), WIDTH);  //rect
                painter->drawPolygon(triangle_polygon_topLeft);
                painter->drawPolygon(triangle_polygon_topRight);
            }
        }
        QStyledItemDelegate::paint(painter, option, index);
        return;
    }
//结束绘制拖拽分隔符
    QStyledItemDelegate::paint(painter, option, index);
}

调用

/**! 拖拽行排序,使用方法
 *  ui控件可直接提升此类
 *  代码直接 new TableView(); 即可
 */

TableView* tableView = new TableView();
//分隔符样式委托
TableItemDelegate *delegate = new TableItemDelegate();
tableView->setItemDelegate(delegate);

QStandardItemModel *model = new QStandardItemModel();
model->setColumnCount(3);
model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("序号"));
model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("姓名"));
model->setHeaderData(2,Qt::Horizontal,QString::fromLocal8Bit("部门"));
for(int i = 0; i < 5; i++)
{
    
     model->setItem(i,0,new QStandardItem(QString::number(i+1)));
     model->setItem(i,1,new QStandardItem(QString::fromLocal8Bit("程序%1").arg(QString::number(i+1))));
     model->setItem(i,2,new QStandardItem(QString::fromLocal8Bit("%1部").arg(QString::number(i+1))));
}
QGridLayout *layout = new QGridLayout(this);
layout->setSpacing(0);
layout->addWidget(tableView);
layout->setContentsMargins(0, 0, 0, 0);
this->setLayout(layout);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pyc_01/article/details/123346957

智能推荐

从零开始搭建Hadoop_创建一个hadoop项目-程序员宅基地

文章浏览阅读331次。第一部分:准备工作1 安装虚拟机2 安装centos73 安装JDK以上三步是准备工作,至此已经完成一台已安装JDK的主机第二部分:准备3台虚拟机以下所有工作最好都在root权限下操作1 克隆上面已经有一台虚拟机了,现在对master进行克隆,克隆出另外2台子机;1.1 进行克隆21.2 下一步1.3 下一步1.4 下一步1.5 根据子机需要,命名和安装路径1.6 ..._创建一个hadoop项目

心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析_heartbleed代码分析-程序员宅基地

文章浏览阅读1.7k次。心脏滴血漏洞HeartBleed CVE-2014-0160 是由heartbeat功能引入的,本文从深入码层面的分析该漏洞产生的原因_heartbleed代码分析

java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)-程序员宅基地

文章浏览阅读1.4k次。前言ofd是国家文档标准,其对标的文档格式是pdf。ofd文档是容器格式文件,ofd其实就是压缩包。将ofd文件后缀改为.zip,解压后可看到文件包含的内容。ofd文件分析工具下载:点我下载。ofd文件解压后,可以看到如下内容: 对于xml文件,可以用文本工具查看。但是对于印章文件(Seal.esl)、签名文件(SignedValue.dat)就无法查看其内容了。本人开发一款ofd内容查看器,..._signedvalue.dat

基于FPGA的数据采集系统(一)_基于fpga的信息采集-程序员宅基地

文章浏览阅读1.8w次,点赞29次,收藏313次。整体系统设计本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下:图1:FPGA数据采集系统框图从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D.._基于fpga的信息采集

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL-程序员宅基地

文章浏览阅读2.5w次。1.背景错误信息:-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud..._com.netflix.zuul.exception.zuulexception

邻接矩阵-建立图-程序员宅基地

文章浏览阅读358次。1.介绍图的相关概念  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:  G=(V,E)其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合1.1 无向图:图中任意两个顶点构成的边是没有方向的1.2 有向图:图中..._给定一个邻接矩阵未必能够造出一个图

随便推点

MDT2012部署系列之11 WDS安装与配置-程序员宅基地

文章浏览阅读321次。(十二)、WDS服务器安装通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下。WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单、安全的通过网络快速、远程将Window..._doc server2012上通过wds+mdt无人值守部署win11系统.doc

python--xlrd/xlwt/xlutils_xlutils模块可以读xlsx吗-程序员宅基地

文章浏览阅读219次。python–xlrd/xlwt/xlutilsxlrd只能读取,不能改,支持 xlsx和xls 格式xlwt只能改,不能读xlwt只能保存为.xls格式xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改xlrd打开文件import xlrdexcel=xlrd.open_workbook('E:/test.xlsx') 返回值为xlrd.book.Book对象,不能修改获取sheett_xlutils模块可以读xlsx吗

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题_unresolved attribute reference 'find_element_by_id-程序员宅基地

文章浏览阅读8.2w次,点赞267次,收藏656次。运行Selenium出现'WebDriver' object has no attribute 'find_element_by_id'或AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'等定位元素代码错误,是因为selenium更新到了新的版本,以前的一些语法经过改动。..............._unresolved attribute reference 'find_element_by_id' for class 'webdriver

DOM对象转换成jQuery对象转换与子页面获取父页面DOM对象-程序员宅基地

文章浏览阅读198次。一:模态窗口//父页面JSwindow.showModalDialog(ifrmehref, window, 'dialogWidth:550px;dialogHeight:150px;help:no;resizable:no;status:no');//子页面获取父页面DOM对象//window.showModalDialog的DOM对象var v=parentWin..._jquery获取父window下的dom对象

什么是算法?-程序员宅基地

文章浏览阅读1.7w次,点赞15次,收藏129次。算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵 魂。二、算法的特征1.可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性) 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。 _算法

【网络安全】网络安全的标准和规范_网络安全标准规范-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏26次。网络安全的标准和规范是网络安全领域的重要组成部分。它们为网络安全提供了技术依据,规定了网络安全的技术要求和操作方式,帮助我们构建安全的网络环境。下面,我们将详细介绍一些主要的网络安全标准和规范,以及它们在实际操作中的应用。_网络安全标准规范