当前位置: 首页 > news >正文

QT基础入门——Qt事件(五)

前言:

事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

一、鼠标事件:

1.鼠标进入事件  enterEvent
2.鼠标离开事件  leaveEvent
3.鼠标按下   mousePressEvent ( QMouseEvent  ev)
4.鼠标释放   mouseReleaseEvent
5.鼠标移动   mouseMoveEvent
6.ev->x() x坐标  ev->y() y坐标
7.ev->button() 可以判断所有按键 Qt::LeftButton  Qt::RightButton
8.ev->buttons()判断组合按键  判断move时候的左右键  结合 & 操作符
9.格式化字符串  QString( “ %1  %2 ” ).arg( 111 ).arg(222)
10.设置鼠标追踪    setMouseTracking(true);

1.mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class myLabel : public QLabel
{
public:explicit myLabel(QWidget *parent = nullptr);//鼠标进入事件void enterEvent(QEvent *event);//鼠标离开事件void leaveEvent(QEvent *);//鼠标按下virtual void mousePressEvent(QMouseEvent *ev);//鼠标释放virtual void mouseReleaseEvent (QMouseEvent *ev);//鼠标移动virtual void mouseNoveEvent (QMouseEvent *ev);signals:};#endif // MYLABEL_H

2.mylabel.cpp

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{//设置鼠标追踪状态setMouseTracking(true);
}//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{qDebug() << "鼠标进入了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *)
{qDebug() << "鼠标离开了";
}//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{//当鼠标左键按下   提示信息if(ev->button() == Qt::LeftButton){QString str = QString("鼠标按下了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}
//鼠标释放
void myLabel::mouseReleaseEvent (QMouseEvent *ev)
{if(ev->button() == Qt::LeftButton){QString str = QString("鼠标释放了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}
//鼠标移动
void myLabel::mouseNoveEvent (QMouseEvent *ev)
{if(ev->button() & Qt::LeftButton){QString str = QString("鼠标移动了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}

3.mylabel.ui

4.运行效果 

 

二、定时器

1.第一种定时器:

利用事件 void  timerEvent ( QTimerEvent * ev)
启动定时器 startTimer( 1000) 毫秒单位
timerEvent 的返回值是定时器的唯一标识  可以和ev->timerId 做比较

(1)widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//重写定时器的事件void timerEvent(QTimerEvent *);int id1;//定时器1的唯一标识int id2;//定时器2的唯一标识private:Ui::Widget *ui;
};
#endif // WIDGET_H

(2)widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//启动定时器id1 = startTimer(1000);//参数1   间隔   单位   毫秒id2 = startTimer(2000);
}//重写定时器的事件
void Widget::timerEvent(QTimerEvent *ev)
{//label1每隔1秒+1if(ev->timerId() == id1){static int num = 1;ui->label_2->setText( QString::number(num++));}//label2每隔2秒+1if(ev->timerId() == id2){static int num2 = 1;ui->label_3->setText( QString::number(num2++));}
}Widget::~Widget()
{delete ui;
}

(3)widget.ui

 (4)运行效果

2.第二种定时器:

利用定时器类 QTimer
创建定时器对象 QTimer * timer = new QTimer(this)
启动定时器  timer->start(毫秒)
每隔一定毫秒,发送信号  timeout  ,进行监听
暂停  timer->stop

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>//定时器的类
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//定时器的第二种方式QTimer *timer = new QTimer(this);//启动定时器timer->start(500);connect(timer,&QTimer::timeout,[=](){//label4每隔2秒+1static int num = 1;ui->label_4->setText(QString::number(num++));});//点击暂停按钮  实现停止定时器connect(ui->btn,&QPushButton::clicked,[=](){timer->stop();});}Widget::~Widget()
{delete ui;
}

三、event事件分发器与过滤器

1.事件分发器

事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。

如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。

用途:用于事件的分发
也可以做拦截操作,不建议
bool event( QEvent * e); 
返回值 如果是true 代表用户处理这个事件,不向下分发了
e->type() == 鼠标按下 

(1)mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class myLabel : public QLabel
{
public:explicit myLabel(QWidget *parent = nullptr);//鼠标进入事件void enterEvent(QEvent *event);//鼠标离开事件void leaveEvent(QEvent *);//鼠标按下virtual void mousePressEvent(QMouseEvent *ev);//鼠标释放virtual void mouseReleaseEvent (QMouseEvent *ev);//鼠标移动virtual void mouseNoveEvent (QMouseEvent *ev);//通过event事件分发器  拦截   鼠标按下事件bool event(QEvent *e);signals:};#endif // MYLABEL_H

(2)mylabel.cpp

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{//设置鼠标追踪状态setMouseTracking(true);
}//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{qDebug() << "鼠标进入了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *)
{qDebug() << "鼠标离开了";
}//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{//当鼠标左键按下   提示信息if(ev->button() == Qt::LeftButton){QString str = QString("鼠标按下了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}
//鼠标释放
void myLabel::mouseReleaseEvent (QMouseEvent *ev)
{if(ev->button() == Qt::LeftButton){QString str = QString("鼠标释放了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}
//鼠标移动
void myLabel::mouseNoveEvent (QMouseEvent *ev)
{if(ev->button() & Qt::LeftButton){QString str = QString("鼠标移动了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}bool myLabel::event(QEvent *e){//如果是鼠标按下   在event事件分发中做拦截操作if(e->type() == QEvent::MouseButtonPress){QMouseEvent * ev = static_cast<QMouseEvent *>(e);QString str = QString("Event函数中:鼠标按下了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true;//true代表用户自己处理这个事件,不向下分发}//其他事件  交给父类处理  默认处理return QLabel::event(e);}

 (3)运行效果

2.事件过滤器

我们已经知道,Qt 创建了QEvent事件对象之后,会调用QObject的event()函数处理事件的分发。显然,我们可以在event()函数中实现拦截的操作。由于event()函数是 protected 的,因此,需要继承已有类。如果组件很多,就需要重写很多个event()函数。这当然相当麻烦,更不用说重写event()函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器。

在程序将时间分发到事件分发器前,可以利用过滤器做拦截
 步骤
          1、给控件安装事件过滤器
          2、重写 eventFilter函数 (obj , ev)

(1)widget.h

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class myLabel : public QLabel
{
public:explicit myLabel(QWidget *parent = nullptr);//鼠标进入事件void enterEvent(QEvent *event);//鼠标离开事件void leaveEvent(QEvent *);//鼠标按下virtual void mousePressEvent(QMouseEvent *ev);//鼠标释放virtual void mouseReleaseEvent (QMouseEvent *ev);//鼠标移动virtual void mouseNoveEvent (QMouseEvent *ev);//通过event事件分发器  拦截   鼠标按下事件bool event(QEvent *e);signals:};#endif // MYLABEL_H

(2)widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>//定时器的类
#include <QMouseEvent>
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给label  安装事件过滤器//步骤1 安装事件过滤器ui->label->installEventFilter(this);
}//步骤2  重写  enentfilter事件
bool Widget::eventFilter (QObject * obj,QEvent * e)
{if(obj == ui->label){if(e->type() == QEvent::MouseButtonPress){QMouseEvent * ev = static_cast<QMouseEvent *>(e);QString str = QString("事件过滤器中:鼠标按下了 x=%1   y=%2   globalX = %3   globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true;//true代表用户自己处理这个事件,不向下分发}}//其他默认处理return QWidget::eventFilter(obj,e);}Widget::~Widget()
{delete ui;
}

 (3)运行效果 

四、绘图事件

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。

QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。

下图给出了这三个类之间的层次结构:

 Qt 的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。

1.QPainter 绘图

(1) 绘图事件  void paintEvent()
(2) 声明一个画家对象  QPainter  painter(this)  this指定绘图设备
(3) 画线、画圆、画矩形、画文字
(4) 设置画笔 QPen  设置画笔宽度 、风格
(5) 设置画刷 QBrush 设置画刷风格

(1)widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//绘图事件void paintEvent(QPaintEvent *);private:Ui::Widget *ui;
};
#endif // WIDGET_H

(2)widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter> //画家类
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);}//绘图事件
void Widget::paintEvent(QPaintEvent *)
{//实例化画家对象  this指定的是绘画设备QPainter painter(this);//设置画笔QPen pen(QColor(255,0,0));//设置画笔宽度pen.setWidth(5);//设置画笔风格pen.setStyle(Qt::DotLine);//设置画家,使用这个笔painter.setPen(pen);//设置画刷QBrush brush(Qt::blue);//设置画刷风格brush.setStyle(Qt::Dense7Pattern);//让画家使用画刷painter.setBrush(brush);//画线painter.drawLine(QPoint(0,0),QPoint(100,100));//画圆painter.drawEllipse(QPoint(100,100),50,50);//画矩形painter.drawRect(QRect(20,20,50,50));//画文字painter.drawText(QRect(10,200,150,50),"你好呀QT");
}Widget::~Widget()
{delete ui;
}

 (3)运行效果 


2.QPainter高级设置

(1).抗锯齿效率低
       painter.setRenderHint(QPainter::Antialiasing);
(2).对画家进行移动
      painter.translate(100,0);
      保存状态 save
      还原状态 restore
(3).如果想手动调用绘图事件 利用update
(4).利用画家画图片 painter.drawPixmap( x,y,QPixmap(  路飞) )

(1)widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//绘图事件void paintEvent(QPaintEvent *);int posX = 0;private:Ui::Widget *ui;
};
#endif // WIDGET_H

(2)widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter> //画家类
#include <QDebug>
#include <QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//点击移动按钮 移动图片connect(ui->toolButton,&QPushButton::clicked,[=](){posX+=20;//如果想手动调用绘图事件 利用updateupdate();});}//绘图事件
void Widget::paintEvent(QPaintEvent *)
{//高级设置QPainter painter(this);//画圆painter.drawEllipse(QPoint(300,50),50,50);//设置抗锯齿能力  效率较低painter.setRenderHint(QPainter::Antialiasing);painter.drawEllipse(QPoint(400,50),50,50);//画矩形painter.drawRect(QRect(20,20,50,50));//移动画家painter.translate(100,100);//保存画家状态painter.save();painter.drawRect(QRect(20,20,50,50));painter.translate(100,100);//还原画家保存状态painter.restore();painter.drawRect(QRect(20,20,50,50));//利用画家画资源图片//如果超出屏幕,再从0开始if(posX > this->width()){posX = 0;}painter.drawPixmap(posX,0,QPixmap(":/Image/Luffy.png"));}Widget::~Widget()
{delete ui;
}

(3)运行效果 

3. QPaintDevice绘图设备

   QPixmap QImage  QBitmap(黑白色) QPicture  QWidget
(1) QPixmap 对不同平台做了显示的优化
               QPixmap pix( 300,300)
               pix.fill( 填充颜色 )
               利用画家 往pix上画画  QPainter painter( & pix)
               保存  pix.save( “路径”)

(2) Qimage 可以对像素进行访问
              使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
              其他流程和QPixmap一样
              可以对像素进行修改 img.setPixel(i,j,value);
(3) QPicture  记录和重现 绘图指令
              QPicture pic
              painter.begin(&pic);
              保存 pic.save( 任意后缀名 )
              重现 利用画家可以重现painter.drawPicture(0,0,pic);
 

(1)widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//绘图事件void paintEvent(QPaintEvent *);
private:Ui::Widget *ui;
};
#endif // WIDGET_H

(2)widget.cpp

Pixmap绘图设备  专门未平台做了显示优化
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QDebug>
#include <QPixmap> //画家类
#include <QImage>
#include <QPicture>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//Pixmap绘图设备  专门未平台做了显示优化QPixmap pix(300,300);//填充颜色pix.fill(Qt::white);//声明画家QPainter painter(&pix);painter.setPen(QPen(Qt::green));painter.drawEllipse(QPoint(150,150),100,100);//保存pix.save("E:\\桌面文件\\pix.png");}//绘图事件
void Widget::paintEvent(QPaintEvent *)
{}Widget::~Widget()
{delete ui;
}

 

QImage 绘图设备  可以对像素进行访问利用QImage 对象素进行修改
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QDebug>
#include <QPixmap> //画家类
#include <QImage>
#include <QPicture>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//QImage 绘图设备  可以对像素进行访问QImage img(300,300,QImage::Format_RGB32);img.fill(Qt::white);QPainter painter(&img);painter.setPen(QPen(Qt::blue));painter.drawEllipse(QPoint(150,150),100,100);//保存img.save("E:\\桌面文件\\pix.png");}//绘图事件
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);//利用QImage 对象素进行修改QImage img;img.load(":/Image/Luffy.png");//修改像素点for(int i = 50;i < 100;i++){for(int j = 50;j < 100;j++){QRgb value = qRgb(255,0,0);img.setPixel(i,j,value);}}painter.drawImage(0,0,img);}Widget::~Widget()
{delete ui;
}

 

QPicture绘图设备 可以记录和重新绘图指令

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QDebug>
#include <QPixmap> //画家类
#include <QImage>
#include <QPicture>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//QPicture绘图设备    可以记录和重新绘图指令QPicture pic;QPainter painter;painter.begin(&pic);//开始往pic上画painter.setPen(QPen(Qt::red));painter.drawEllipse(QPoint(150,150),100,100);painter.end();//结束画画//保存到磁盘pic.save("E:\\桌面文件\\pic.zt");
}//绘图事件
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);//重现QPicture绘图指令QPicture pic;pic.load("E:\\桌面文件\\pic.zt");painter.drawPicture(0,0,pic);
}Widget::~Widget()
{delete ui;
}

 

相关文章:

QT基础入门——Qt事件(五)

前言&#xff1a; 事件&#xff08;event&#xff09;是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制的时候&#xff0c;都会发出一个相应的事件。一些事件在对用户操作做出响应时发出&#xff0c;如键盘事件等&#x…...

自学黑客方法-----(网络安全)

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…...

Dockerfile自定义容器

1、Dockerfile Dockerfile 是用于构建 Docker 镜像的文本文件&#xff0c;其中包含一系列的指令和配置&#xff0c;用于定义镜像的构建过程。通过 Dockerfile&#xff0c;你可以定义镜像的基础操作系统、依赖、环境设置、应用程序等信息&#xff0c;从而实现可复制、自动化的镜…...

(5)SpringMVC处理携带JSON格式(“key“:value)请求数据的Ajax请求

SpringMVC处理Ajax 参考文章数据交换的常见格式,如JSON格式和XML格式 请求参数的携带方式 浏览器发送到服务器的请求参数有namevalue&...(键值对)和{key:value,...}(json对象)两种格式 URL请求会将请求参数以键值对的格式拼接到请求地址后面,form表单的GET和POST请求会…...

【iOS】——仿写计算器

文章目录 一、实现思路二、实现方法三、判错处理 一、实现思路 先搭建好MVC框架&#xff0c;接着在各个模块中实现各自的任务。首先要创建好UI界面&#xff0c;接着根据UI界面的元素来与数据进行互动&#xff0c;其中创建UI界面需要用到Masonry布局。 二、实现方法 在calcu…...

公安机关警务vr综合实战模拟训练提高团队合作能力

公安出警VR虚拟仿真培训软件是VR公司利用VR虚拟现实和web3d开发技术&#xff0c;对警务执法过程中可能发生的各种场景进行还原、模拟、演练&#xff0c;结合数据分析&#xff0c;实施量化考核&#xff0c;提高学员的心理承压、应急处突、遇袭反应和临危处置综合能力。 公安出警…...

MySQL-1(12000字详解)

一&#xff1a;数据库的引入 数据库在我们以后工作中是一个非常常用的知识&#xff0c;数据库用来存储数据&#xff0c;但是有些同学可能就会疑惑了&#xff0c;存储数据用文件就可以了&#xff0c;为什么还要弄个数据库呢&#xff1f; 文件保存数据有以下几个缺点&#xff1…...

voc数据集格式与yolo数据集格式的区别及相互转化

Pascal VOC数据集是目标检测领域最常用的标准数据集之一&#xff0c;几乎所有检测方向的论文都会给出其在VOC数据集上训练并评测的效果。VOC数据集包含的信息非常全&#xff0c;它不仅被拿来做目标检测&#xff0c;也可以拿来做分割等任务&#xff0c;因此除了目标检测所需的文…...

超详细!Android Termux上如何安装MySQL,内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…...

TSNE降维学习

在学习使用Cora数据集时&#xff0c;输入的初始为[2708, 1433], 输入一共有2708个点&#xff0c;每个节点有1433个特征。测试集的大小为[1000, 1433]最后的输出为[1000, 7]&#xff0c;表示每个点的类别。 我们要的就是查看这个[1000, 7]的预测结果。想要将他展示在一个平面上是…...

基于Python+Selenium的web自动化测试框架详解

简介 随着Web应用程序的广泛应用和不断发展&#xff0c;Web自动化测试已经成为软件质量保证中的一个重要环节。而PythonSelenium作为一组强大的工具和框架&#xff0c;已经成为Web自动化测试领域中的热门技术之一。PythonSelenium可以帮助我们快速、准确地模拟用户行为和操作&…...

C (1094) : DS双向链表—前驱后继

Description 在双向链表中&#xff0c;A有一个指针指向了后继节点B&#xff0c;同时&#xff0c;B又有一个指向前驱节点A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点&#xff0c;也能从链表尾节点开始遍历所有节点。 对于给定的一列数据&#xff0c;按照给定的…...

mp4视频太大怎么压缩变小?

mp4视频太大怎么压缩变小&#xff1f;确实&#xff0c;很多培训和教学都转向了线上模式&#xff0c;这使得我们需要下载或分享大量的在线教学视频。然而&#xff0c;由于MP4视频文件通常较大&#xff0c;可能会遇到无法打开或发送的问题。为了解决这个问题&#xff0c;我们可以…...

利用easy excel 实现文件导出

一.创建实体类 package com.siact.product.jwp.module.report.dto;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alib…...

LongLoRA:超长上下文,大语言模型高效微调方法

麻省理工学院和香港中文大学联合发布了LongLoRA&#xff0c;这是一种全新的微调方法&#xff0c;可以增强大语言模型的上下文能力&#xff0c;而无需消耗大量算力资源。 通常&#xff0c;想增加大语言模型的上下文处理能力&#xff0c;需要更多的算力支持。例如&#xff0c;将…...

【漏洞复现】某 NVR 视频存储管理设备远程命令执行

漏洞描述 NUUO NVR是中国台湾NUUO公司旗下的一款网络视频记录器&#xff0c;该设备存在远程命令执行漏洞&#xff0c;攻击者可利用该漏洞执行任意命令&#xff0c;进而获取服务器的权限。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&am…...

若依前端-应用路径发布和使用

官网的路径&#xff1a;前端手册 | RuoYi 应用路径 有些特殊情况需要部署到子路径下&#xff0c;例如&#xff1a;https://www.ruoyi.vip/admin&#xff0c;可以按照下面流程修改。 1、修改vue.config.js中的publicPath属性 publicPath: process.env.NODE_ENV "produ…...

Mojo 正式发布,Rust 能否与之匹敌?

9 月 7 日&#xff0c;Modular 公司宣布正式发布 Mojo&#xff1a;Mojo 现在已经开放本地下载——初步登陆 Linux 系统&#xff0c;并将很快提供 Mac 与 Windows 版本。据介绍&#xff0c;Mojo 最初的目标是比 Python 快 35000 倍&#xff0c;近日该团队表示&#xff0c;Mojo 将…...

opencv实现抠图,图像拼接,图像融合

在OpenCV中&#xff0c;你可以使用图像拼接、抠图和将图像的一部分放在另一张图片的指定位置。以下是示例代码&#xff0c;演示如何执行这些操作&#xff1a; 图像拼接 要将两张图像拼接在一起&#xff0c;你可以使用 cv::hconcat&#xff08;水平拼接&#xff09;和 cv::vco…...

照片处理软件Lightroom Classic mac中文版功能介绍(Lrc2021)

Lightroom Classic 2022 mac是一款桌面编辑工具&#xff0c;lrc2021 mac包括提亮颜色、使灰暗的摄影更加生动、删除瑕疵、将弯曲的画面拉直等。您可以在电脑桌面上轻松整理所有照片。使用Lightroom Classic&#xff0c; 轻松整理编辑照片&#xff0c;为您的作品锦上添花。 Ligh…...

asp.net高校留学生信息管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 高校留学生信息管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使 用c#语言开发 asp.net留学生信息管理系…...

C# - Opencv应用(1) 之VS下环境配置详解

C# - Opencv应用&#xff08;1&#xff09; 之VS下环境配置详解 有时候&#xff0c;单纯c#做前端时会联合C实现的dll来落地某些功能由于有时候会用C - Opencv实现算法后封装成dll&#xff0c;但是有时候会感觉麻烦&#xff0c;不如直接通过C#直接调用Opencv在此慢慢总结下C# -…...

rsync 远程同步实现快速、安全、高效的异地备份

目录 1 rsync 远程同步 1.1 rsync是什么&#xff1f; 1.2 rsync同步方式 1.3 rsync的特性 1.4 rsync的应用场景 1.5 rsync与cp、scp对比 1.6 rsync同步源 2 配置rsync源服务器 2.1 建立/etc/rsyncd.conf 配置文件 3 发起端 4 发起端配置 rsyncinotify 4.1 修改rsync…...

医学访问学者面试技巧

医学访问学者面试是一个非常重要的环节&#xff0c;它决定了你是否能够获得这个宝贵的机会去国外的大学或研究机构学习和研究。在这篇文章中&#xff0c;知识人网小编将分享一些关于医学访问学者面试的技巧&#xff0c;帮助你在面试中表现出色。 1. 准备充分 在参加医学访问学…...

【19】c++设计模式——>桥接模式

桥接模式的定义 C的桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系&#xff0c;将系统划分成多个独立的、功能不同的类层次结…...

网络安全:六种常见的网络攻击手段

1、什么是VPN服务&#xff1f; 虚拟专用网络&#xff08;或VPN&#xff09;是您的设备与另一台计算机之间通过互联网的安全连接。VPN服务可用于在离开办公室时安全地访问工作计算机系统。但它们也常用于规避政府审查制度&#xff0c;或者在电影流媒体网站上阻止位置封锁&#…...

使用HbuilderX运行uniapp中小程序项目

下载HbuilderX&#xff0c;下载链接&#xff1a; HBuilderX-高效极客技巧 导入相关项目。下载微信开发者工具。使用微信开发者工具打开&#xff1a;注意&#xff1a;如果是第一次使用&#xff0c;需要先配置小程序ide的相关路径&#xff0c;才能运行成功。如下图&#xff0c;需…...

基于PHP的水果商城网站,mysql数据库,前台+后台,原生PHP,PHP study(小皮),完美运行,有一万字报告。

目录 演示视频 基本介绍 论文目录 购买流程 系统截图 演示视频 基本介绍 基于PHP的水果商城网站&#xff0c;mysql数据库&#xff0c;前台后台&#xff0c;原生PHP&#xff0c;PHP study&#xff08;小皮&#xff09;&#xff0c;完美运行&#xff0c;有一万字报告。 前…...

【uniapp】自定义导航栏时,设置安全距离,适配不同机型

1、在pages.json中&#xff0c;给对应的页面设置自定义导航栏样式 {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitl…...

JAVA经典百题之数组逆序输出

题目:将一个数组逆序输出。 程序分析 要将一个数组逆序输出&#xff0c;即将数组中的元素顺序颠倒过来&#xff0c;可以使用多种方法。基本思路是创建一个新数组或修改原数组&#xff0c;将元素的顺序颠倒。 方法1: 创建新数组实现 思路 创建一个新的数组&#xff0c;长度…...

张家口高新区做网站/seo网站关键词排名快速

目标检测是计算机视觉和模式识别的重要研究方向,主要是确定图像中是否有感兴趣的目标存在,并对其进行探测和精确定位。传统的目标检测流程采用滑动窗口进行区域选择,然后采用 SIFT、HOG 等方法进行特征提取,最后采用 SVM、Adaboost 进行类别判断。但是传统的目标检测方法面…...

西安h5响应式网站/广告设计需要学什么

文章目录一、Scheduled定时任务器1、启动类2、任务调度类3、执行结果4、corn表达式&#xff08;1&#xff09;各字段的含义&#xff08;2&#xff09;常用的cron表达式&#xff08;3&#xff09;注意二、SpringBoot整合Quartz定时任务框架1、quartz介绍2、quartz的定时功能简单…...

网站建设与思想政治教育/重庆网站排名提升

下午受邀请参加了一个BBS活动&#xff0c;于是有了下面的内容。 下面是在linux网站运维方向老男孩最近几年常用的免费的开源软件&#xff0c;临时即兴想起来的&#xff0c;在这里和大家分享&#xff0c;希望给初学者指引一点路。 linux的世界真的很精彩&#xff0c;还没入门的朋…...

论文检索网站怎么做/免费b2b网站推广

php fsockopen 可以 post json数据吗&#xff1f; 知道的请留下代码&#xff0c;在此谢过&#xff01;回复内容&#xff1a;php fsockopen 可以 post json数据吗&#xff1f; 知道的请留下代码&#xff0c;在此谢过&#xff01;因为不清楚你所说的 json 数据具体是想要怎么提交…...

网站开发组合/人民日报今天新闻

Vim简介 Vim 是一个高度可配置的文本编辑器&#xff0c;旨在让创建和更改任何类型的文本变得非常高效。大多数 UNIX 系统和 Apple OS X 都将它作为“vi”包含在内&#xff0c;用惯了Linux中的Vim编辑器&#xff0c;如果需在Windows的cmd终端中编辑文件&#xff0c;则需要单独安…...

关于网站的毕业论文/株洲seo推广

一、基本概念 归并排序是将两个有序序列合并成一个有序序列的过程。 详细步骤&#xff1a; 申请空间&#xff0c;使其大小为两个已经排序序列之和&#xff0c;该空间用来存放合并后的序列设定两个指针&#xff0c;最初位置分别为两个已经排序序列的起始位置比较两个指针所指向的…...