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

QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤

一 自定义控件

现在的需求是这样:

假设我们要在QWidget 上做定制,这个定制包括了关于 一些事件处理,意味着要重写QWidget的一些代码,这是不实际的,因此我们需要自己写一个MyWidget继承QWidget,然后再MyWidget.cpp中重写事件处理的函数。

而且我们希望在 mainwidget.ui上就有自己写的MyWidget,而不是默认的QWidget,这样我们就能在mainwidget.ui上预留我们想要的位置。这时候怎么办呢?

1. 写一个自己的MyWidget,将自己写的MyWidget可以在mainwindow.ui上显示

如下是我们在ui上的弄了一个QWidget,我们的目标是将这个QWidget变成MyWidget,然后再MyWidget.cpp中重写我们的方法

新建MyWidget.cpp类

我们看到 就多出来了mywidget.h 和 mywidget.cpp文件

然后再回到 ui文件,提升ui上的widget为mywidget

取消提升

2. 给自己写的MyWidget上添加想要的UI

我们现在是想给这个Mywidget 中加入 两个控件,一个是spin box,一个是horizontal slider

当spin box 的值变化的时候,会影响 horizontal slider的变化。

这里为了区分 主要的widget,和我们写的MyWidget,我们将主要的widget改名为mainwidget。主要是为了方便理解,没有额外的意义。

一种方法当前是从ui 上拖过去

我们从ui上拖过去控件,主要是在代码中为了给从这些控件得到数据---例如得到这个控件是否被点击,这个控件的值,这个控件中填写的数据等。那么我们如何得到这个控件呢?

得到从ui上拖过去的spin box 和horizontal slider

每一个控件都有一个唯一的objectName,(从ui上的可以看到)。因此要获得某一个控件,在代码上一般通过ui->objectName可以获得(注意是一般情况下)。

那么这个objectName是个啥呢?

如下图:我们拖进去了两个 SpinBox,随便选中一个,就可以看到 这个SpinBox有一个objectName,我们可以改动这个objectName的值,如下,但是objectName是唯一的值,因此不等重复,我们可以试图将两个SpinBox改名为一样,发现不行,QT会帮我们自动改回来。

通过ui->objectName 获得控件代码

 _spinBox = ui->spinBox;
_horizontalSlider =  ui->horizontalSlider;

看一下源码(ui_mainwidget.h),可以看到实际上QT 在将xxx.ui  构建成 ui_xxx.h 的时候,是先通过 objectName,new 出来组件,new出来组件的名字和objectName名字一致。因此给我们的感觉是ui->objectName,就能得到组件。实际上new出来的组件的名字并不一定和objectName名字一致,因此写代码的时候要注意看源码。

扩展,灯下黑--这里还有一个问题:如何得到最外层的widget呢?也就是主widget。

实际上我们ui就是widget的 成员变量,因此this 就最大的widget。

我们知道这个最大的widget,也就是this有啥用呢?

可以通过this 获得所有我们想要找的组件,比如 findchildren();如果想使用,可以参考 qt api 说明

扩展 在mainwidget构造方法中,让spin box 和 horizontal slider 的值使用信号和槽关联起来

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//注意我们写的位置,并不是在mywidget.cpp中写的,//是在main 加载的最大的widget上写的,这是因为只有最大的widget才有ui变量,我们要通过ui变量找到对应的控件_spinBox = ui->spinBox;_horizontalSlider =  ui->horizontalSlider;//我们想将 _spinBox 的valuechanged 信号发出去后,让 _horizontalSlider调用setvalue方法//A段代码 ------ A,B,C代码段实现的功能是一样的,如果不理解,先在自己的博客search 一下 函数指针  ,然后再 seacher一下 static_cast,将这两个文章弄明白就理解了void (QSpinBox::* testSignal)(int) = &QSpinBox::valueChanged;connect(_spinBox,testSignal,_horizontalSlider,&QSlider::setValue);//B段代码 ------ A,B,C代码段实现的功能是一样的typedef void (QSpinBox ::*PFUNCTYPE5 )(int) ;PFUNCTYPE5 testSignal4 = &QSpinBox::valueChanged;connect(_spinBox,testSignal4,_horizontalSlider,&QSlider::setValue);//C段代码 ------ A,B,C代码段实现的功能是一样的connect(_spinBox,static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),_horizontalSlider,&QSlider::setValue);connect(_horizontalSlider, &QSlider::valueChanged,_spinBox, &QSpinBox::setValue);
}

一种方法是在Mywidget.cpp中使用代码实现

我们先通过UI将 自己给Mywidget中的画上去的spinbox删除,将horizontal slider 删除。

以免得影响我们测试

那么当前UI上的Mywidget就啥也没有,我们在MyWidget的构造方法中就可以构建新的UI,并加上去。

代码部分

注意这个代码实现的地方。

另外注意:这个代码偷懒,并没有将QHBoxLayout写到.h中,这是不好的。

另外,还需要注意的是,如果我们不加 QHBoxLayout,那么就要手动的标识 spinbox 和 slider的位置,很容易发生问题,因此在自己写,或者使用ui的时候,最好都用 这样layout

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{QHBoxLayout *layout = new QHBoxLayout(this);//注意我们写的位置,并不是在mywidget.cpp中写的,//是在main 加载的最大的widget上写的,这是因为只有最大的widget才有ui变量,我们要通过ui变量找到对应的控件_spinBox = new QSpinBox(this);layout->addWidget(_spinBox);_horizontalSlider =  new QSlider(Qt::Horizontal,this);layout->addWidget(_horizontalSlider);//我们想将 _spinBox 的valuechanged 信号发出去后,让 _horizontalSlider调用setvalue方法//A段代码 ------ A,B,C代码段实现的功能是一样的,如果不理解,先在自己的博客search 一下 函数指针  ,然后再 seacher一下 static_cast,将这两个文章弄明白就理解了void (QSpinBox::* testSignal)(int) = &QSpinBox::valueChanged;connect(_spinBox,testSignal,_horizontalSlider,&QSlider::setValue);//B段代码 ------ A,B,C代码段实现的功能是一样的typedef void (QSpinBox ::*PFUNCTYPE5 )(int) ;PFUNCTYPE5 testSignal4 = &QSpinBox::valueChanged;connect(_spinBox,testSignal4,_horizontalSlider,&QSlider::setValue);//C段代码 ------ A,B,C代码段实现的功能是一样的connect(_spinBox,static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),_horizontalSlider,&QSlider::setValue);connect(_horizontalSlider, &QSlider::valueChanged,_spinBox, &QSpinBox::setValue);
}

二 自定义控件的事件的处理,自定义控件的事件过滤器

当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。

一些事件在对用户操作做出响应时发出,如键盘事件等;

另一些事件则是由系统自动发出,如计时器事件。

处理流程一:当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent

处理流程二:Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)

由于event()函数是负责分发的,那么我们就可以定制那么事件分发,那么事件不分发了。

处理流程三:重写我们想要的回调函数-也就是 event handler

Object 将这些event handler都定义成 virtual 的

使用方法:我们在自定义的组件中,重写我们想要额外处理的event handler 函数。

  1. keyPressEvent()
  2. keyReleaseEvent()
  3. mouseDoubleClickEvent()
  4. mouseMoveEvent()
  5. mousePressEvent()
  6. mouseReleaseEvent() 等。

因此我们首先能想到的就是在最后的处理流程中,对于我们感兴趣的event handler函数,进行自定义处理。

我们自定义一个MyLable,继承于QLable,重写几个eventhandler函数,看一下,这里还自己写一个MyWidget,主要是看一下,写两个自定义的Ui的嵌套case下,是怎么样子的。

MyLable.h

#ifndef MYLABLE_H
#define MYLABLE_H#include <QWidget>
#include <QLabel>
#include <QEvent>
#include <QMouseEvent>
#include <QDebug>>class MyLable : public QLabel
{Q_OBJECT
public:explicit MyLable(QWidget *parent = nullptr);signals:protected:void enterEvent(QEvent *event) override;void leaveEvent(QEvent *event) override ;void mouseMoveEvent(QMouseEvent *event)override;};#endif // MYLABLE_H

MyLable.cpp

#include "mylable.h"MyLable::MyLable(QWidget *parent) : QLabel(parent){//这里设置鼠标不用点击,就能看到mousemoveevnetthis->setMouseTracking(true);
}void MyLable::enterEvent(QEvent *event) {qDebug()<<"enterevent call";this->setText("进入了lable");}void MyLable::leaveEvent(QEvent *event){qDebug()<<"leaveEvent call";this->setText("离开了lable");
}void MyLable::mouseMoveEvent(QMouseEvent *event){qDebug()<<"mouseMoveEvent call";qDebug()<<event->x() <<"  " << event->y()<< endl;
}

三 原始控件的 特殊事件处理流程-事件过滤器

前面我们学习了自定义控件,以及自定义控件的 event()和eventhandler处理。

但是要求都是要自定义控件,如果我们有很多的控件,这些自定义控件都有或多或少的event事件要处理,那岂不是工作量很大,因此QT 提供了让我们可以过滤处理的方法,即事件过滤器。

事件过滤器的位置:

使用方法:

1. 注册想要过滤的ui控件,

         void installEventFilter(QObject *filterObj)

                _pushbutton.installEventFilter(this);

        参数 filterObj的含义是:注册完成的ui的过滤事件在 filterIObj的eventFilter()方法中,当前是在 mainwidget中写的,也就是 会在mainwidget 的 eventFilter 函数中过滤 _pushbutton

2. 重写 eventFilter方法,watched就是要过滤的ui,event就是要过滤的event
virtual bool eventFilter(QObject *watched, QEvent *event)

不想让它继续转发,就返回 true,

如果不想处理否则返回 false。实际上 return 给自己的父类去处理

return QWidget::eventFilter(watched,event);

代码实现:

MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget)
{ui->setupUi(this);_pushButton = ui->pushButton;_radioButton = ui->radioButton;//正常点下,放松,改动了button 上面的文字connect(_pushButton,&QPushButton::pressed,[=](){_pushButton->setText("该button被按下");});connect(_pushButton,&QPushButton::released,[=](){_pushButton->setText("该button被放松");});connect(_pushButton,&QPushButton::clicked,[=](){_pushButton->setText("该button被点击");});//注册pushbutton有过滤事件,原本 button 的pressed 后,会有显示,现在我们要过滤pressed事件,因此代码后,再点击就没有 setText("该button被按下"); 发生了_pushButton->installEventFilter(this);}//重写eventFulter事件
bool MainWidget::eventFilter(QObject *watched, QEvent *event){if(watched == _pushButton){if(event->type()==QEvent::MouseButtonPress){qDebug()<<"ccc";return true;}else{return QWidget::eventFilter(watched,event);}}else{//如果是其他的 object,则要让父类处理,不能直接return falsereturn QWidget::eventFilter(watched,event);}
}

总结

注意,

事件过滤器和被安装过滤器的组件必须在同一线程,否则,过滤器将不起作用。另外,如果在安装过滤器之后,这两个组件到了不同的线程,那么,只有等到二者重新回到同一线程的时候过滤器才会有效。

相关文章:

QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤

一 自定义控件 现在的需求是这样&#xff1a; 假设我们要在QWidget 上做定制&#xff0c;这个定制包括了关于 一些事件处理&#xff0c;意味着要重写QWidget的一些代码&#xff0c;这是不实际的&#xff0c;因此我们需要自己写一个MyWidget继承QWidget&#xff0c;然后再MyWi…...

Leetcode算法方法总结

1. 双指针法解决链表/数组题目 只要数组有序&#xff0c;就要想到双指针做法。还有二分法 回文串一般也会用到双指针&#xff0c;回文串的长度由于可能是奇数也可能是偶数&#xff0c;所以在寻找时&#xff0c;既需要寻找奇数长度的回文串&#xff0c;也需要寻找偶数长度的回文…...

【Elasticsearch基础】基本核心概念介绍

Elasticsearch作为当前最流行的分布式搜索和分析引擎&#xff0c;其强大的功能背后是一套精心设计的核心概念体系。本文将深入解析Elasticsearch的五大核心概念&#xff0c;帮助开发者构建坚实的技术基础&#xff0c;并为高效使用ES提供理论支撑。 1 索引&#xff08;Index&…...

docker远程debug

1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时&#xff0c;需要添加 JVM 调试参数&#xff0c;jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本&#xff1a; java -Xdebug -Xrunjdwp:tra…...

华为eNSP-配置静态路由与静态路由备份

一、静态路由介绍 静态路由是指用户或网络管理员手工配置的路由信息。当网络拓扑结构或者链路状态发生改变时&#xff0c;需要网络管理人员手工修改静态路由信息。相比于动态路由协议&#xff0c;静态路由无需频繁地交换各自的路由表&#xff0c;配置简单&#xff0c;比较适合…...

CentOS 7下安装PostgreSQL 15

一、简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业…...

时序数据库 InfluxDB(一)

时序数据库 InfluxDB&#xff08;一&#xff09; 数据库种类有很多&#xff0c;比如传统的关系型数据库 RDBMS&#xff08; 如 MySQL &#xff09;&#xff0c;NoSQL 数据库&#xff08; 如 MongoDB &#xff09;&#xff0c;Key-Value 类型&#xff08; 如 redis &#xff09…...

动态添加view方法-微信小程序

在微信小程序中&#xff0c;通过动态数据绑定和条件渲染来实现动态添加 view 组件的效果。 以下是一个简单的示例&#xff0c;展示如何根据数据动态添加 view。 WXML 文件 在 WXML 文件中&#xff0c;使用 wx:for 指令来遍历数组&#xff0c;并动态生成 view 组件。 <view…...

Java中清空集合列表元素有哪些方式

在 Java 里&#xff0c;存在多种清空列表的方式&#xff0c;下面为你汇总并附上对应的示例代码&#xff1a; import java.util.ArrayList; import java.util.List;public class ListClearDemo {public static void main(String[] args) {// 初始化一个列表List<String> …...

QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)

QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口&#xff0c;并且需要实现加载模型后重新渲染更新窗口的功能&#xff0c;但是一直无法更新被卡住了&#xff0c;现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…...

00.【Linux系统编程】 Linux初识(云服务器设置CentOS并使用、Xshell链接云服务器)

目录 一、华为云服务器免费体验申请 二、Xshell远程链接创建好的华为云服务器 2.1 下载Xshell 2.2 Xshell远程连接华为云服务器 一、华为云服务器免费体验申请 华为云官网 1. 进入华为云官网&#xff0c;最上面一栏点活动&#xff0c;并进入免费体验中心。 2. 找到含有“…...

数据结构-二叉链表存储的二叉树

树形结构是一类重要的非线性数据结构&#xff0c;其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树&#xff0c;称其为二叉树。二叉树的链式存储结构是一类重要的数据结构&#xff0c;其形式定义如下&#xff1a; 而二叉树的前序、中序遍历是非常重要的能够访…...

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例&#xff0c;介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下&#xff0c;通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…...

idea中快速注释函数

在IntelliJ IDEA中&#xff0c;有多种方法可以快速注释函数。 使用快捷键 你可以使用以下快捷键来快速注释函数[3]&#xff1a; 行注释&#xff1a;使用Ctrl/&#xff08;Windows系统&#xff09;或Command/&#xff08;Mac系统&#xff09;可以在当前行前添加或删除单行注释…...

Leetcode13-罗马数字转整数

题目链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 如同上一题&#xff0c;直接用暴力法破解&#xff0c;简单好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…...

3、pytest实现参数化

在 pytest 中&#xff0c;参数化&#xff08;parametrization&#xff09;是一种强大的功能&#xff0c;可以让你用不同的输入数据重复执行同一个测试函数。这种功能非常有用&#xff0c;可以帮助你显著减少重复代码并提高测试覆盖率。 参数化的主要作用是&#xff1a; 测试多…...

深入理解指针(4)(C语言版)

文章目录 前言一、回调函数是什么&#xff08;一&#xff09;定义&#xff08;二&#xff09;工作原理&#xff08;三&#xff09;应用场景 二、qsort举例&#xff08;一&#xff09;qsort函数简介&#xff08;二&#xff09;比较函数的定义&#xff08;三&#xff09;使用示例…...

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的日志管理:Logback 的集成

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...

记录一次渗透测试/常用命令

渗透测试常用命令速览&#xff1a;从扫描到提权再到流量劫持 在渗透测试中&#xff0c;命令行工具是我们的得力助手。本文总结了我最近在测试虚拟机靶机&#xff08;IP: 192.168.73.129&#xff09;时用到的主要命令&#xff0c;涵盖网络扫描、暴力破解、权限提升、数据修改和…...

C++11QT复习(二)

文章目录 Day4-4 New 与 delete 表达式&#xff08;2025.03.20&#xff09;1. new 表达式的三个步骤2. delete 表达式的两个步骤3. new[] 与 delete[] Day5 类的定义和关键字再探&#xff08;2025.03.24&#xff09;1. C 关键字 const、static、extern2. 类的定义&#xff1a;C…...

Pytorch学习笔记(十)Learning PyTorch - Learning PyTorch with Examples

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Learning PyTorch with Examples 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/pytorch_with_examples.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m…...

如何使用DeepSeek编写测试用例?

一、DeepSeek在测试用例设计中的定位 DeepSeek作为AI工具,并非直接替代测试设计,而是通过以下方式提升效率: 快速生成基础用例框架(等价类、边界值等) 智能补充易遗漏场景(如特殊字符、异常流) 自动化脚本片段生成(Python/pytest/JUnit等) 测试数据构造建议(符合业务…...

sql server如何提高索引命中率

#新星杯14天创作挑战营第9期# 前言 近期发现以前开发的系统运行缓慢&#xff0c;经排查&#xff0c;发现有很大的优化空间。数据库版本使用的是sql server&#xff0c;主要有以下一些问题点&#xff1a;数据表无索引、一些不规范的写法&#xff08;例如in、大表关联&#xff0…...

FALL靶机

下载靶机&#xff0c;可以看到靶机地址 在kali上扫描靶机的端口和目录文件 访问&#xff1a;http://192.168.247.146/test.php&#xff0c;他提示我们参数缺失 我们爆破一下他的参数 使用kali自带的fuzz FUZZ就是插入参数的位置 -w 指定字典文件 wfuzz -u "http://192.…...

北斗导航 | 改进最小二乘残差法的接收机自主完好性监测算法原理,公式,应用,研究综述,matlab代码

改进最小二乘残差法的接收机自主完好性监测算法研究 摘要 本文针对传统最小二乘残差RAIM算法在复杂环境下检测性能不足的问题,提出了一种基于加权抗差估计的改进算法。通过引入IGGⅢ权函数构建抗差最小二乘模型,结合滑动窗口方差估计和自适应阈值调整机制,显著提升了算法对…...

WPF 浅述ToolTipService.ShowOnDisabled

WPF 浅述ToolTipService.ShowOnDisabled ToolTipService.ShowOnDisabled 属性可以让工具提示在控件禁用状态下仍然显示。这是一个非常方便且简洁的方式。 使用 ToolTipService.ShowOnDisabled&#xff0c;你可以通过设置 ToolTipService.ShowOnDisabled 属性来确保即使在控件禁…...

嵌入式硬件工程师从小白到入门-PCB绘制(二)

PCB绘制从小白到入门&#xff1a;知识点速通与面试指南 一、PCB设计核心流程 需求分析 明确电路功能&#xff08;如电源、信号处理、通信&#xff09;。确定关键参数&#xff08;电压、电流、频率、接口类型&#xff09;。 原理图设计 元器件选型&#xff1a;匹配封装、电压、…...

05 Python 元组:不可变序列的解析和应用

文章目录 前言元组定义元组的运算索引操作切片操作连接和重复运算循环遍历元组中的元素成员运算内置函数运算 打包和解包操作交换变量的值 前言 在 Python 编程领域&#xff0c;元组&#xff08;Tuple&#xff09;是一类极为重要的数据结构。它属于不可变的序列类型&#xff0…...

MATLAB 批量移动 TIF 文件至分类文件夹

文章目录 前言一、步骤二、代码 前言 本代码用于从指定的源文件夹 (sourceFolder) 中筛选所有 .tif 文件&#xff0c;并根据文件名的特定关键词&#xff08;Daynight 和 FDI&#xff09;将其分类移动到相应的目标文件夹 (targetDaynightFolder 和 targetFDIFolder)。 一、步骤…...

Milvus×最新版DeepSeek v3:对标Claude,本地数据五分钟写网站

前言 就在昨晚&#xff0c;DeepSeek v3推出了新版本V3-0324&#xff0c;再次一夜爆火。 虽然官方表示“这只是一次小升级”“API接口和使用方式不变”&#xff0c;但经过Zilliz的第一时间实测&#xff0c;我们发现无论是逻辑能力&#xff0c;还是编程能力&#xff0c;相较原本的…...

抽象代数:群论

系列笔记为本学期上抽象代数课整理的&#xff0c;持续更新。 群的相关定义 群的定义 群是一个带有满足结合律、单位元、逆元的二元运算的集合&#xff0c;记作 ( G , ⋅ ) \left({G, \cdot}\right) (G,⋅)。若群运算满足结合律&#xff0c;则该集合构成半群。如果该半群中含…...

基于 mxgraph 实现流程图

mxgraph 可以实现复杂的流程图绘制。mxGraph里的Graph指的是图论(Graph Theory)里的图而不是柱状图、饼图和甘特图等图(chart)&#xff0c;因此想找这些图的读者可以结束阅读了。 作为图论的图&#xff0c;它包含点和边&#xff0c;如下图所示。 交通图 横道图 架构图 mxGrap…...

Stereolabs ZED Box Mini:机器人与自动化领域的人工智能视觉新选择

在人工智能视觉技术快速发展的今天&#xff0c;其应用场景正在持续拓宽&#xff0c;从智能安防到工业自动化&#xff0c;从机器人技术到智能交通&#xff0c;各领域都在积极探索如何利用这一先进技术。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款专为满足这些多样化…...

音视频 二 看书的笔记 MediaPlayer

此类是用于播放声音和视频的主要 API 对方不想多说向你丢了一个链接 MediaPlayer Idle 空闲状态Initialized 初始化状态 调用 setDataSource() 时会进入此状态 setDataSource必须在Idle 状态下调用&#xff0c;否则就抛出异常了了了了了。Prepared 准备状态 回调监听setOnPrep…...

可以把后端的api理解为一个目录地址,但并不准确

将后端的 API 理解为一个“目录地址”是可以的&#xff0c;但并不完全准确。让我们更详细地解释一下。 目录 1、生动形象了解api 2、后端 API 的作用 3、可以将 API 理解为“目录地址”的原因 &#xff08;1&#xff09;URL 路径 &#xff08;2&#xff09;层次结构 4、…...

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题&#xff1a; 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…...

Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject

一、前言 JSON作为轻量级的数据交换格式&#xff0c;已成为开发者必备技能。Qt框架为JSON处理提供了完整的解决方案&#xff0c;通过QJsonDocument、QJsonObject和QJsonArray三大核心类&#xff0c;轻松实现数据的序列化与反序列化。 JSON vs INI 特性JSONINI数据结构支持嵌…...

开源视频剪辑工具,无损编辑更高效

LosslessCut 是一款基于 FFmpeg 开发的跨平台开源视频剪辑工具&#xff0c;致力于无损处理音视频文件。它无需重新编码即可完成剪切、合并、轨道编辑等操作&#xff0c;极大地保留了原始文件的质量&#xff0c;特别适合处理大体积视频&#xff0c;如无人机拍摄素材或长时录制内…...

Git 之配置ssh

1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com...

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第一种写法id选择器&#xff0c;其实XPath元素定位要比CSS好用&#xff0c;原因是CSS无法使用下标&#xff08;工作当中也是常用的xpath&#xff09;&#xff0c;但CSS定位速度比XPat…...

Mysql---锁篇

1&#xff1a;MySQL 有哪些锁&#xff1f; 全局锁 flush tables with read lock 整个数据库就处于只读状态了 unlock tables 释放全局锁 全局锁主要应用于做全库逻辑备份&#xff0c;这样在备份数据库期间&#xff0c;不会因为数据或表结构的更新&#xff0c;而出现备份文件的数…...

Django 项目打包exe本地运行

Django 项目打包exe本地运行 记一次离谱的需求 其实本来觉得Django项目架构比较清晰,代码逻辑也简单,没打算记笔记,结果遇到离谱需求折腾了很久 开发了一个Django项目,到交付的时候了,客户说自己没有服务器… 没服务器还要登录功能😓 没办法,甲方最大,整吧 第一…...

20250330 Pyflink with Paimon

1. 数据湖 2. 本地安装Pyflink和Paimon 必须安装Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手动加入这两个jar 测试代码&#xff1a; import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…...

RTMP推流服务器nginx在linux上的编译部署

RTMP&#xff08;Real-Time Messaging Protocol&#xff09;推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流&#xff0c;对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接&#xff0c;处理推流数据&#xff08;如转码、录制等&…...

Matlab教程001:软件介绍和界面使用

1.1 软件介绍 1.1.1 Matlab的介绍 MATLAB&#xff08;MATrix LABoratory&#xff09;是一款由 MathWorks 公司开发的高级编程语言和交互式环境&#xff0c;广泛用于 科学计算、数据分析、机器学习、工程建模、仿真和信号处理 等领域。 1.1.2 主要应用领域 数据分析与可视化…...

【SQL Server数据库备份详细教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

Java设计模式之解释器模式

概念 解释器模式是一种行为型设计模式&#xff0c;用于定义一种语言的语法规则&#xff0c;并提供解释器来解释该语言中的表达式。 作用 其核心作用是将复杂的语法分解为简单的语法单元&#xff0c;通过递归组合的方式构建抽象语法树&#xff08;AST&#xff09;&#xff0c…...

el-date-picker时间范围 编辑回显后不能修改问题

el-date-picker daterange时间范围 编辑回显后不能修改 <el-form-item:label"LABELS.gplanRecordDateLabel"prop"gplanRecordDate"><el-date-pickerstyle"width: 300px"v-model"formData.gplanRecordDate"type"daterang…...

vue复习1~45

1.关于vue 要理解记忆规则&#xff0c;可以到官网上去找 vue的两种使用方式 vue核心包开发 场景&#xff1a;局部模块改造vue核心包 & vue插件 工程化开发 场景&#xff1a;整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…...

Servlet开发与生命周期详解-2

一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多&#xff0c;其中目前使用比较多的是&#xff1a; IntelliJ IDEA&#xff08;这个居多&#xff0c;IDEA在提示功能方面要强于Eclipse&#xff0c;也就是说IDEA使用起来比Eclipse更加智能&#xff0c;更好用。JetBrai…...