QT的绘图系统QPainterDevice与文件系统QIODevice

QT的绘图系统(QPainterDevice)与文件系统(QIODevice)

文章目录

  • 1、Qt 的绘图系统
    • 1、QPainter的使用
    • 2、QPen(画笔)及QBursh(画刷)
    • 3、手动更新窗口
    • 4、绘图设备
        • 1、四种绘图设备的 区别
        • 2、 QBitmap
        • 3、QPixmap
        • 4、 QImage
        • 5、QPicture
        • 6、QImage与QPixmap的转换
  • 2、不规则窗口
  • 3、文件系统
    • 1、QFile文件的读写
    • 2、QT的QString与QByteArray以及char *的相互转换
    • 3、文件信息QFileInfo类
    • 4、二进制文件读写 QDataStream类(打开是看不懂)
    • 5、文本文件读写QTextStream类
    • 6、内存读写QBuffer类
  • 4、总结


1、Qt 的绘图系统

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainterQPainterDeviceQPaintEngine三个类。
在这里插入图片描述
下图给出了这三个类之间的层次结构:
在这里插入图片描述
上面的示意图告诉我们,Qt 的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。

1、QPainter的使用

对窗口绘图首先要重写**void paintEvent(QPaintEvent *)**虚函数。

  1. 重写绘图事件,虚函数
  2. 如果在窗口绘图,必须放在绘图事件里实现
  3. 绘图事件内部自动调用,窗口需要重绘的时候(状态改变)
void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//指定当前窗口为绘图设备p.drawPixmap(rect(), QPixmap("../Image/bk.jpg"));     //画背景图//画直线p.drawLine(50, 50, 150, 50); /* 在坐标50,50的位置画长150,宽50的线 */p.drawLine(50, 50, 50, 150);//画矩形;l;dp.drawRect(150, 150, 100, 50);//画圆形p.drawEllipse(QPoint(150, 150), 50, 25);
}

注意:在上层目录要有背景图的存在。要先画背景图在画直线,矩形,圆形。
指定QQidget对象为绘图对象。即窗口是绘图设备。QQidget继承与QPaintDevice.
在这里插入图片描述

2、QPen(画笔)及QBursh(画刷)

QPainter有很多以 draw 开头的函数,用于各种图形的绘制,比如drawLine(),drawRect()以及drawEllipse()等。
如果需要设置画家的颜色,风格,线条的粗细。从而引入画笔。如果需要填充图形的颜色需要画刷

void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//指定当前窗口为绘图设备//画背景图p.drawPixmap(rect(), QPixmap("../Image/bk.jpg"));//定义画笔QPen pen;pen.setWidth(5); //设置线宽pen.setColor( QColor(14, 9, 234) );//rgb设置颜色pen.setStyle(Qt::DashLine); //设置风格p.setPen(pen); //把画笔交给画家QBrush brush; //创建画刷对象brush.setColor(Qt::red); //设置颜色brush.setStyle(Qt::Dense1Pattern);//设置样式p.setBrush(brush);//把画刷交给画家//画直线p.drawLine(50, 50, 150, 50); /* 在坐标50,50的位置画长150,宽50的线 */p.drawLine(50, 50, 50, 150);//画矩形;l;dp.drawRect(200, 200, 100, 50);//画圆形p.drawEllipse(QPoint(150, 150), 50, 25);
}

3、手动更新窗口

当我们在窗口绘制的图不断变化时。需要不断地刷新窗口才会有变化。否则不会有。
mywidget.h

class MyWidget : public QWidget
{Q_OBJECT
public:MyWidget(QWidget *parent = nullptr);~MyWidget();void paintEvent(QPaintEvent *);
private:int x;QPushButton *button;
private slots:void FunSlot(void);
private:Ui::MyWidget *ui;
};

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QPainter>MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget)
{ui->setupUi(this);x = 0;QPushButton *button = new QPushButton(this);button->setText("向右移动");connect(button, &QPushButton::pressed, this, &MyWidget::FunSlot);
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//画笑脸p.drawPixmap(x, 180, 80, 80, QPixmap("../Image/face.png"));}
void MyWidget::FunSlot(void)
{x += 20;if(x > width()- 80){x = 0;}//刷新窗口,让窗口重绘,整个窗口都刷新update(); //间接调用paintEvent()
}

点击按钮绘图不断向右移动变化。到窗口终点又回到起点。

4、绘图设备

1、四种绘图设备的 区别

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。
在这里插入图片描述
**QBitmap:**是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。
总结:它们操作都方法都是差不多一样的。

2、 QBitmap

QBitmap只有黑白两种颜色。

void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//QPixmap 图片背景透明p.drawPixmap(0, 0, QPixmap("../Image/face.png"));//QBitmap 图片背景透明p.drawPixmap(200, 0, QBitmap("../Image/face.png"));//QPixmap 图片背景白色QPixmap pixmap;pixmap.load("../Image/image.jpg");p.drawPixmap(0, 200, pixmap);//QBitmap 图片背景白色QBitmap bitmap;bitmap.load("../Image/image.jpg");p.drawPixmap(400, 200, bitmap);
}

在这里插入图片描述
右边为QBitmap 左边为QPixmap。上面的QBitmap为黑色背景。下面为QBitmap的白色背景。

3、QPixmap

如下在QPixmap绘图而不是在窗口。不用重写绘图事件。在构造函数里实现即可。

MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);//绘图设备, 400*300QPixmap pixmap(400, 300);QPainter p(&pixmap);//画笔填充白色背景色//p.fillRect(0, 0, 400, 300, QBrush(Qt::white));//画家填充白色背景色pixmap.fill(Qt::white);p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));//上层路径保存图片pixmap.save("../pixmap.jpg");
}

在上层目录生成pixmap.jpg文件。
在这里插入图片描述

4、 QImage

QImage可以对像素点进行操作。

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//创建一个绘图设备,QImage::Format_ARGB32背景是透明QImage image(400, 300, QImage::Format_ARGB32);QPainter p;p.begin(&image);//绘图p.drawImage(0, 0, QImage("../Image/image.jpg"));//对绘图设备前50个像素点进行操作for(int i = 0; i < 50; i++){for(int j = 0; j < 50; j++){image.setPixel(QPoint(i, j), qRgb(0, 255, 0)); /* 设置像素点 *///image.pixel(QPoint(i, j)); /* 获取像素点 */}}p.end();image.save("../image.png"); // 保存图片
}

在上层目录生成image.png文件。绿色部分为对像素点的操作。
在这里插入图片描述

5、QPicture
MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);QPicture picture;QPainter p;p.begin(&picture);p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));p.drawLine(50, 50, 150, 50);p.end();//保存的是二进制文件picture.save("../picture.png");
}

在这里插入图片描述
在上层路径生成picture.png的二进制文件。
二进制打开也看不出效果。我们在窗口里加载出来。重写绘图事件。

void MyWidget::paintEvent(QPaintEvent *)
{QPicture pic;pic.load("../picture.png"); //加载二进制picture.png文件QPainter p(this);p.drawPicture(0, 0, pic);
}

运行结果如下:
在这里插入图片描述

6、QImage与QPixmap的转换

在对屏幕进行优化可能需要用到QPixmap。在传输可能需要用到QImage。

void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);QPixmap pixmap;pixmap.load("../Image/face.png");//QPixmap -> QImageQImage tempImage = pixmap.toImage();p.drawImage(0, 0, tempImage);QImage image;image.load("../Image/face.png");//QImage -> QPixmapQPixmap tempPixmap = QPixmap::fromImage(image);p.drawPixmap(200, 0, tempPixmap);
}

运行结果:
在这里插入图片描述
第一张是通过QPixmap转QImage画的。第二张是通过QImage转QPixmap画的。

2、不规则窗口

常见的窗体是各种方形的对话框,但有时候也需要非方形的窗体,如圆形,椭圆甚至是不规则形状的对话框。
widget.h

class Widget : public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = 0);~Widget();protected:void paintEvent(QPaintEvent *);void mouseMoveEvent(QMouseEvent *e);void mousePressEvent(QMouseEvent *e);
private:QPoint p;
private:Ui::Widget *ui;
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//去窗口表框Qt::FramelessWindowHint   windowFlags()其它属性不变setWindowFlags(Qt::FramelessWindowHint | windowFlags());//把窗口背景设置为透明setAttribute(Qt::WA_TranslucentBackground);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *)
{QPainter p(this);p.drawPixmap(0, 0, QPixmap("../Image/sunny.png"));
}void Widget::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::RightButton){//如果是右键close();}else if(e->button() == Qt::LeftButton){//求坐标差值//当前点击坐标(屏幕)-窗口左上角坐标p = e->globalPos() - this->frameGeometry().topLeft();}
}void Widget::mouseMoveEvent(QMouseEvent *e)
{/* 移动加鼠标左键按下 */if(e->buttons() & Qt::LeftButton){move(e->globalPos() - p); // 当前点击坐标(屏幕) -  求坐标差值}
}

当鼠标左键按下移动无规则窗口跟着移动。鼠标右键按下则无规则窗口关闭。
如下图片关于上面代码的坐标计算的示意图
在这里插入图片描述

3、文件系统

文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、QFile文件的读写

QFile提供了从文件中读取和写入数据的能力。
我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。
ui界面如下:
在这里插入图片描述
功能:把读取到文件显示在文本框里。把文本框里的内容保存成文件。

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QFile>
#include<QFileDialog>
#include<QDebug>MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);connect(ui->pushButtonRead, &QPushButton::pressed, this, &MyWidget::ReadSlot);connect(ui->pushButtonWrite, &QPushButton::pressed, this, &MyWidget::WriteSlot);
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::ReadSlot(void)
{QString path = QFileDialog::getOpenFileName(this,"open", "../", "TXT(*.txt)");if(path.isEmpty() == false){//文件对象QFile file(path);//打开文件,只读方式bool isOk = file.open(QIODevice::ReadOnly);if(isOk == true){
// 一次读取全部
#if 0 \//读文件,默认只识别utf8编码 在文件流才可以改变编码格式QByteArray array = file.readAll();//显示到编辑区//ui->textEdit->setText(QString(array));//ui->textEdit->setText(array);
#endif// 一次读取一行QByteArray array;while( file.atEnd() == false){//读一行array += file.readLine();}ui->textEdit->setText(array);}//关闭文件file.close();}
}void MyWidget::WriteSlot(void)
{QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt)");if(path.isEmpty() == false){QFile file; //创建文件对象//关联文件名字file.setFileName(path);//打开文件,只写方式bool isOk = file.open(QIODevice::WriteOnly); /* 有就打开否则创建 */if(isOk == true){//获取编辑区内容QString str = ui->textEdit->toPlainText();//写文件file.write(str.toUtf8());}file.close();}
}

2、QT的QString与QByteArray以及char *的相互转换

            // QString -> QByteArrayfile.write(str.toUtf8());//QString -> c++ string -> char *file.write(str.toStdString().data());//转换为本地平台编码file.write(str.toLocal8Bit());//QString -> QByteArrayQString buf = "123";QByteArray a = buf.toUtf8(); //中文a = buf.toLocal8Bit(); //本地编码//QByteArray -> char *char *b = a.data();//char * -> QStringchar *p = "abc";QString c = QString(p);

3、文件信息QFileInfo类

在这里插入图片描述

#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>QString path = QFileDialog::getOpenFileName(this, "open", "../");if(path.isEmpty() == false){//获取文件信息QFileInfo info(path);qDebug() << "文件名字:" << info.fileName().toUtf8().data();qDebug() << "文件后缀:" << info.suffix();qDebug() << "文件大小:" << info.size();qDebug() << "文件创建时间:" <<info.birthTime().toString("yyyy-MM-dd hh:mm:ss"); //2024-01-04 15:13:00}

4、二进制文件读写 QDataStream类(打开是看不懂)

在这里插入图片描述
mywidget.h

#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACEclass MyWidget : public QWidget
{Q_OBJECTpublic:MyWidget(QWidget *parent = nullptr);~MyWidget();void writeData();void readData();
private:Ui::MyWidget *ui;
};

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDataStream>
#include <QFile>
#include <QDebug>
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);writeData();readData();
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::writeData()
{//创建文件对象QFile file("../hello.txt");//打开文件, 只写方式打开bool isOk = file.open(QIODevice::WriteOnly);if(true == isOk){//创建数据流,和file文件关联//往数据流中写数据,相当于往文件里写数据QDataStream stream(&file);stream << QString("你好") << 777;file.close();}}void MyWidget::readData()
{//创建文件对象QFile file("../hello.txt");//打开文件, 只读方式打开bool isOk = file.open(QIODevice::ReadOnly);if(true == isOk){//创建数据流,和file文件关联//往数据流中读数据,相当于往文件里读数据QDataStream stream(&file);//读的时候,按写的顺序取数据QString str;int a;stream >> str >> a;//qDebug() << str.toUtf8().data() << a;cout << str.toUtf8().data() << a;file.close();}
}

先写入数据流(二进制形式),然后以写的顺序读出来。
需要注意的是,你必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。
那么,既然QIODevice提供了read()、readLine()之类的函数,为什么还要有QDataStream呢?QDataStream同QIODevice有什么区别?区别在于,QDataStream提供流的形式,性能上一般比直接调用原始 API 更好一些。

5、文本文件读写QTextStream类

在这里插入图片描述
ui界面:
在这里插入图片描述

widget.h

#include <QWidget>namespace Ui {
class Widget;
}
class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void writeData();
private slots:void on_pushButton_clicked();
private:Ui::Widget *ui;
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTextStream>
#include <QFile>
#include <QDebug>
#include <QFileDialog>
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);writeData();}Widget::~Widget()
{delete ui;
}void Widget::writeData()
{QFile file;file.setFileName("../TextStream.txt");bool isOk = file.open(QIODevice::WriteOnly);if(true == isOk){QTextStream stream(&file);//指定编码stream.setEncoding(QStringConverter::Utf8);stream << QString("你好") << 777;file.close();}
}void Widget::on_pushButton_clicked()
{QString path = QFileDialog::getOpenFileName(this,"open", "../"  );if(false == path.isEmpty()){QFile file;file.setFileName(path);bool isOk = file.open(QIODevice::ReadOnly);if(true == isOk){QTextStream stream(&file);//指定编码stream.setEncoding(QStringConverter::Utf8);QString str = stream.readAll();ui->textEdit->setText(str);file.close();}}
}

当使用QDataStream写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以文本形式写入数据,是没有数据之间的分隔的。因此,使用文本文件时,很少会将其分割开来读取,而是使用诸如使用:
QTextStream::readLine() 读取一行
QTextStream::readAll()读取所有文本。

6、内存读写QBuffer类

    QByteArray array;QBuffer memFile(&array); //创建内存文件 还指定QByteArray对象memFile.open(QIODevice::WriteOnly);memFile.write("5455454");memFile.write("6564565");memFile.close();qDebug() << memFile.buffer();qDebug() << "array:" << array;

写进了内存也保存在了指定的QByteArray对象里。

QBuffer与QDataStream一起操作dome。

    QBuffer memFile1;memFile1.open(QIODevice::WriteOnly); /* 只写 */QDataStream stream(&memFile1); /* QBuffer与QDataStream关联 */stream << QString("测试") << 999;memFile1.close();/* 关闭文件 */qDebug() <<  memFile1.buffer();memFile1.open(QIODevice::ReadOnly); /* 只读 */QDataStream in;in.setDevice(&memFile1);QString str;int a;in >> str >> a;memFile1.close(); /* 关闭文件 */qDebug() << str.toUtf8().data() << a;qDebug() <<  memFile1.buffer();

运行结果:
在这里插入图片描述

4、总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了QT的绘图系统与文件系统。

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

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

相关文章

零食折扣店,注定昙花一现?

年终岁末&#xff0c;又到了各类休闲零食产品一年一度的销售旺季。与过去不同的是&#xff0c;近年来的休闲零食赛道正因大量零食折扣店的涌现而显得热闹非凡。 随着主打折扣、低价的零食折扣店成为消费者特别是三四线下沉市场消费者的新宠&#xff0c;资本开始涌入并快速推动…

SpringCloud之OpenFeign的学习、快速上手

1、什么是OpenFeign OpenFeign简化了Http的开发。在RestTemplate的基础上做了封装&#xff0c;在微服务中的服务调用发送网络请求起到了重要的作用&#xff0c;简化了开发&#xff0c;可以让我们跟写接口一样调其他服务。 并且OpenFeign内置了Ribbon实现负载均衡。 官方文档…

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一&#xff1a;简介二&#xff1a;Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三&#xff1a;代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址&#xff1a; https://gitee.com/lymgoforIT/golang-trick/t…

SpringBoot3整合OpenAPI3(Swagger3)

文章目录 一、引入依赖二、使用1. OpenAPIDefinition Info2. Tag3. Operation4. Parameter5. Schema6. ApiResponse swagger2更新到3后&#xff0c;再使用方法上发生了很大的变化&#xff0c;名称也变为OpenAPI3。 官方文档 一、引入依赖 <dependency><groupId>…

深度解析Python关键字:掌握核心语法的基石(新版本35+4)

目录 关键字 keyword 关键字列表 kwlist softkwlist 关键字分类 数据类型 True、False None 运算类型 and、or、not in is 模块导入 import 辅助关键字 from、as 上下文管理 with 占位语句 pass 流程控制 if、elif、else for while break、continue…

第十回 朱贵水亭施号箭 林冲雪夜上梁山-FreeBSD/Linux 控制台基础操作

林冲被众庄客捉住&#xff0c;吊在门楼下&#xff0c;正被打时&#xff0c;柴进来了&#xff0c;赶快把林冲救下来。原来这是柴进打猎用的小庄子&#xff0c; 林冲就把火烧草料场一事跟柴进详细的说了。柴进说兄弟真是命运多磨难啊。林冲住了几日&#xff0c;恐怕连累柴进&…

Laykefu客服系统 任意文件上传漏洞复现

0x01 产品简介 Laykefu 是一款基于workerman+gatawayworker+thinkphp5搭建的全功能webim客服系统,旨在帮助企业有效管理和提供优质的客户服务。 0x02 漏洞概述 Laykefu客服系统/admin/users/upavatar.html接口处存在文件上传漏洞,而且当请求中Cookie中的”user_name“不为…

[学习笔记]刘知远团队大模型技术与交叉应用L3-Transformer_and_PLMs

RNN存在信息瓶颈的问题。 注意力机制的核心就是在decoder的每一步&#xff0c;都把encoder的所有向量提供给decoder模型。 具体的例子 先获得encoder隐向量的一个注意力分数。 注意力机制的各种变体 一&#xff1a;直接点积 二&#xff1a;中间乘以一个矩阵 三&#xff1a;…

找不到vcruntime140_1.dll无法继续执行怎么办?全面分析修复方法

当系统提示vcruntime140_1.dll文件出现错误时&#xff0c;可能会引发一系列影响计算机正常运行的问题。这个特定的动态链接库文件&#xff08;DLL&#xff09;是Microsoft Visual C Redistributable的一部分&#xff0c;对于许多基于Windows的应用程序来说至关重要。一旦vcrunt…

回归预测 | Python基于ALO-BiGRU蚁狮优化算法优化双向BiGRU多变量回归预测+适应度曲线+多个评价指标

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ALO算法是Mirjalili于2015提出的一种新型元启发式群智能算法。由于引入了随机游走、轮盘赌策略及精英策略&#xff0c;使得 ALO 算法成为一种种群多样、寻优性能强、调节参数少、易于实现的搜索技术 python代码 优化参…

线段树详解

什么是线段树&#xff1f; 1、线段树是一棵二叉搜索树&#xff0c;它储存的是一个区间的信息。 2、每个节点以结构体的方式存储&#xff0c;结构体包含以下几个信息&#xff1a; 区间左端点、右端点&#xff1b;&#xff08;这两者必有&#xff09; 这个区间要维护的信息&…

【leetcode】移除元素

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…

【题目】2023年国赛信息安全管理与评估正式赛任务书-模块3 CTF

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块三 网络安全渗透、理论技能与职业素养 竞赛相关资源资料可在文末关注公众号获得 比赛时间及注意事项 本阶段比赛时长为180分钟&#xff0c;时间为9:00-12:00。 【注意事项】 &#xff08;1&#xf…

算法优化:LeetCode第122场双周赛解题策略与技巧

接下来会以刷常规题为主 &#xff0c;周赛的难题想要独立做出来还是有一定难度的&#xff0c;需要消耗大量时间 比赛地址 3011. 判断一个数组是否可以变为有序 public class Solution {public int minimumCost(int[] nums) {if (nums.length < 3) {// 数组长度小于3时&a…

UG制图-创建图纸的多种方法

1、2D&#xff1a;创建独立2D图纸&#xff0c;不引用任何3D模型 在UG软件中选择新建&#xff0c;或者快捷键ctrl N&#xff0c;进入新建命令&#xff0c;然后点击图纸&#xff0c;在关系中选择独立的部件&#xff0c;就创建了一个独立的图纸&#xff0c;我们可以在装配中添加…

项目管理该考哪个证书❓NPDP还是软考❓

有小伙伴在纠结是要考NPDP认证呢还是考软考呢❓ 今天小编要给大家好好说说NPDP认证❗️ &#x1f4a1;NPDP全称New Product Development Professional&#xff0c;也就是产品经理国际资格认证。 &#x1f525;NPDP是国际公认的为一的新产品开发专业认证&#xff0c;是集理论、方…

「环境配置」使用Windows自带工具清理C盘空间

​ Windows电脑操作系统一般是安装在磁盘驱动器的C盘中&#xff0c;一旦运行&#xff0c;便会产生许多垃圾文件&#xff0c;C盘空间在一定程度上都会越来越小。伴随着电脑工作的时间越久&#xff0c;C盘常常会提示显示其内存已不足。本文记录笔者清理机器的步骤。 一、使用Win…

在Qt中通过控制按钮实现登录界面密码与明码的转换

创建控件&#xff1a; 首先&#xff0c;在Qt设计师界面界面上创建QLineEdit类文本框&#xff0c;用于输入密码&#xff0c;并且实现密码与明码相互转化。 设置初始状态&#xff1a; 默认情况下&#xff0c;输入密码的文本框应该是可见的并允许用户输入。 添加切换按钮&…

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …

【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

replica shard重启具体流程 replica shard node &#xff08;generic threadpool&#xff09; 也是因为应用新的集群状态触发recovery&#xff0c;进入index阶段进入translog 阶段。先尝试重放本地的translog到global checkpoint向primary shard发起start recovery的请求&…