信号槽【QT】
文章目录
- 对象树
- 字符集
- 信号槽
- QT坐标系
- 信号与槽
- connect
- 自定义槽
- 自定义信号
- disconnect
对象树
#ifndef MYLABEL_H
#define MYLABEL_H#include<QLabel>
class MyLabel : public QLabel
{
public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWidget * parent);~MyLabel() ;
};#endif // MYLABEL_H
上述代码,在 Qt 中不会产生内存泄露。
label 对象会在合适的时候被析构释放~~(虽然没有手动写 delete,确实能释放)
之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。
使用对象树,把这些内容组织起来,最主要的目的,就是为了能够在合适的时机 (窗口关闭/销毁)
把这些对象统一进行释放.
如果对象树的某个对象提前销毁,此时就会导致对应的控件就在界面上不存在了
#include "mylabel.h"
#include<iostream>
#include<QDebug>
MyLabel::MyLabel(QWidget * parent):QLabel(parent)
{}MyLabel::~MyLabel()
{//打印日志//会出现乱码//std::cout << "MyLabel 被销毁!" << std::endl;//QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。//直接使用 qDebug() 可以当做 cout来使用qDebug() << "MyLabel 被销毁!";
}
析构函数是执行了,虽然没有手动 delete,但是由于把 MyLabel 挂到了对象树上。此时窗口被销毁的时候,就会自动销毁对象树中的所有对象。MyLabel 的析构是执行了
解决乱码方案:
Qt 中提供了一个 qDebug() 工具,可以完成打印日志的过程。很好的处理字符编码
QDebug 是 Qt 中的类。又不会直接使用这个类。这个宏,封装了 QDebug 对象。
直接使用 qDebug() 这个东西就可以当做 cout 来使用。
使用 qDebug,打印的调试日志,是可以统一进行关闭的,qDebug 可以通过编译开关,来实现一键式关闭
字符集
出现乱码, 就是编码方式不匹配( 不局限于 C++)
如果字符串本身是 utf8 编码的,但是终端(控制台)是按照 gbk 的方式来解析显示的(拿着 utf8 这里的数值,去查询 gbk 的码表),就会出现乱码
用记事本方式来打开文件,将文件另存为,并查看文件字符集
显示的是 UTF-8,说明这个文件就是 UTF-8 编码
显示的是 ANSI,说明这个文件就是 GBK 编码
信号槽
Qt 中的 connect 是 QObject 这个类提供的静态函数。这个函数的作用就是 “连接信号和槽”
在 Qt Designer 中创建一个控件时,此时就会给这个控件分配一个 objectName 属性。这个属性的值,要求是在界面中得是唯一的(不能重复)
QPushButton :
qmake 在预处理 .ui 文件的时候,就会根据这里的 objectName 生成对应的 C++ 代码。C++ 代码中该 QPushButton 对象的变量名字就是这里的 objectName。这个变量就是 ui 属性中的成员变量。
Qt的用户界面(UI)系统大量使用了元编程,特别是通过使用.ui文件来设计界面, Qt 会根据ui文件,生成一个ui_widget.h 文件生成的过程中就会感知到,界面上都有哪些控件,每个控件的objectName.
widget.cpp文件中通过connect连接信号与槽函数
通过图形化界面的方式,实现的按钮版 hello world
此时按钮对象,不需要new , new 对象的操作已经是被 Qt 自动生成了
而且这个按钮对象,已经作为 ui 对象里的一个成员变量了。
也无需作为 Widget 的成员
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->myButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{//获取文本是hello Worldif(ui->myButton->text() == QString("hello World")){// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello qt");}//获取文本不是hello Worldelse{// 当按钮被点击之后,就把按钮中的文本,进行切换ui->myButton->setText("hello World");}
}
widget.cpp
纯代码方式实现Hello World
纯代码版本:
myButton按钮对象是new 的
为了保证其他函数中能够访问到这个变量,就需要把myButton按钮对象设定为 Widget 类的成员变量
#include "widget.h"
#include "ui_widget.h"
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myButton = new QPushButton(this) ;myButton->setText("hello world") ;//将信号与槽函数关联connect(ui->pushButton ,&QPushButton::clicked ,this , &Widget::handleClick );
}Widget::~Widget()
{delete ui;
}
//槽函数void Widget::handleClick (){//检查myButton按钮的当前文本 是否为"hello world"if(myButton->text() == QString("hello world")){myButton->setText("hellp qt") ;}else{myButton->setText("hellp world") ; }}
QT坐标系
坐标系的原点 (0, 0) 就是屏幕的左上角 / 窗口的左上角
给 Qt 的某个控件,设置位置,就需要指定坐标。对于这个控件来说,坐标系原点就是相对于父窗口/控件的。
例如:
QPushButton 的父元素/父控件/父窗口 是 QWidget
QWidget 没有父元素 (NULL),就相当于父元素就是整个显示器桌面了~~
信号与槽
Qt 中,谈到信号,也是涉及到三个要素
信号源:由哪个控件发出的信号。
信号的类型:用户进行不同的操作,就可能触发不同的信号。
例如:点击按钮,触发点击信号。在输入框中移动光标,触发移动光标的信号。勾选一个复选框,选择一个下拉框,都会触发出不同的信号。
信号的处理方式:槽(slot),就是函数
Qt 中可以使用 connect 这样的函数,把一个信号和一个槽关联起来。后续只要信号触发了,Qt 就会自动的执行槽函数
槽函数,本质上也是一种"回调函数" (callback)
一定是先把信号的处理方式准备好,再触发信号
Qt 中,一定是先关联号信号和槽,然后再触发这个信号,顺序不能颠倒,否则信号就不知道如何处理了
connect
connect,这个函数和 Linux 中TCP的socket 中建立连接的函数,没有任何关系,只是名字恰巧一样了。
connect是 QObject 提供的静态的成员函数。
connect(const QObject *sender,const char *signal,const QObject *receiver,const char *method,Qt::ConnectionType type = Qt::AutoConnection);
sender : 当前信号是哪个控件发出来的
signal : 信号的类型
receiver : 哪个对象(控件)负责处理
method: 这个对象如何处理 (要处理信号的对象提供的成员函数)
type : 很少使用,暂时不考虑
例如:
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton * button = new QPushButton(this) ;button->setText("关闭") ;button->move(200,300);//close是QWidget内置的槽函数. Widget继承自QWidget,也就继承了QWidget的槽函数.//close:关闭当前的窗口/控件connect(button ,&QPushButton::clicked , this , &Widget::close) ;
}
Widget::~Widget()
{delete ui;
}
自定义槽
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置按钮//点击按钮就修改窗口标题QPushButton * button = new QPushButton (this) ; //this,挂到对象树上button->setText("按钮");button->move(100,100); //移动坐标connect(button , &QPushButton::clicked , this , &Widget::handleClicked) ;}Widget::~Widget()
{delete ui;
}void Widget::handleClicked()
{//点击按钮就修改窗口标题setWindowTitle("按钮已经按下");}
自定义槽函数 ,用ui界面
在Qt 中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接
选择clicked() ,就会在widget.cpp 生成on_pushButton_clicked 函数的定义
当函数名符合上述规则之后,Qt就能自动的把信号和槽给建立上联系
自定义信号
Qt 的信号,本质上也就是一个“函数”
Qt 5 以及更高版本中,槽函数和普通的成员函数之间,基本没有差别
但是信号,则是一类非常特殊的函数。
程序员只要写出函数声明,并且告诉 Qt,这是一个“信号”即可。
这个函数的定义,是 Qt 在编译过程中自动生成的。(自动生成的过程,程序员无法干预)
作为信号函数,这个函数的返回值,必须是void ,有没有参数都可以, 甚至也可以支持重载
signals : 是 Qt 自己扩展出来的关键字
qmake 的时候,调用一些代码的分析/生成工具,
扫描到类中包含signals 这个关键字的时候.此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义
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();//自定义信号
signals:void mysignal() ;//自定义槽函数
public slots: //qt5以上 ,public slots可以省略void handleMySignal() ; private:Ui::Widget *ui;
};
#endif // WIDGET_H
如何才能触发出自定义的信号呢?
Qt 内置的信号,不需要手动通过代码来触发
用户在 GUI,进行某些操作,就会自动触发对应信号。(发射信号的代码已经内置到 Qt 框架中了)
例:
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal()
{setWindowTitle("处理自定义信号");
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal();// 发出自定义的信号//emit可以省略
}
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();//自定义信号
signals:void mysignal() ;//自定义槽函数
public slots:void handleMySignal() ;//槽函数
private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
信号和槽也可以带参数
当信号带有参数的时候,槽的参数必须和信号的参数一致~~
此时发射信号的时候,就可以给信号函数传递实参。与之对应的这个参数就会被传递到对应的槽函数中。
这里的参数类型必须要一致
个数可以不一致,但是 信号的参数的个数必须要比槽的参数个数要更多。
个数可以不一致,但是 信号的参数的个数必须要比槽的参数个数要更多 ,原因:
一个槽函数,有可能会绑定多个信号,如果我们严格要求参数个数一致,就意味着信号绑定到槽的要求就变高了。换而言之,当下这样的规则,就允许信号和槽之间的绑定更灵活了。更多的信号可以绑定到这个槽函数上了
例如:
参数类型必须要一致 ,个数一致
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text )
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal("把标题设置为标题1");// 发出自定义的信号
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把标题设置为标题2");// 发出自定义的信号
}
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();//自定义信号
signals:void mysignal(const QString & text) ;//自定义槽函数
public slots:void handleMySignal(const QString & text) ;//槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
参数类型必须要一致 ,信号的参数的个数必须要比槽的参数个数要更多
例如:
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将自定义信号与槽函数绑定connect (this, &Widget::mysignal , this, &Widget::handleMySignal) ;}Widget::~Widget()
{delete ui;
}void Widget::handleMySignal(const QString & text)
{setWindowTitle(text);
}void Widget::on_pushButton_clicked()
{//发送信号的操作,也可以在任意合适的代码中.不一定非得在构造函数里//此时就是点击按钮的时候,发送自定义信号了emit mysignal("把标题设置为标题1","");// 发出自定义的信号
}void Widget::on_pushButton_2_clicked()
{emit mysignal("把标题设置为标题2","");// 发出自定义的信号
}
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();//自定义信号
signals:void mysignal(const QString & text,const QString & text2) ;//自定义槽函数
public slots:void handleMySignal(const QString & text) ;//槽函数
private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
Q_OBJECT:
Qt硬性规定:Qt中如果要让某个类能够使用信号槽(可以在类中定义信号和槽函数)
必须要在类最开始的地方,写下 Q_OBJECT 宏。
一个信号,可以 connect到多个槽函数上
一个槽函数,也可以被多个信号 connect
例如:
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();
signals://自定义信号void mySignal1() ;void mySignal2() ;void mySignal3() ;
public slots://自定义槽函数void mySlot1();void mySlot2();void mySlot3();private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//信号与槽函数 ,形成多对多的关系connect(this, &Widget::mySignal1, this, &Widget::mySlot1);connect(this, &Widget::mySignal1, this, &Widget::mySlot2);connect(this, &Widget::mySignal2, this, &Widget::mySlot1);connect(this, &Widget::mySignal2, this, &Widget::mySlot3);
}Widget::~Widget()
{delete ui;
}void Widget::mySlot1()
{qDebug() << "mySlots1" ;
}
void Widget::mySlot2()
{qDebug() << "mySlots2" ;
}
void Widget::mySlot3()
{qDebug() << "mySlots3" ;
}
disconnect
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();
public slots :void handClick() ;
public slots :void handClicked2();
private slots:void on_pushButton_2_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//将信号与槽函数关联connect(ui->pushButton ,& QPushButton::clicked, this , &Widget::handClick) ;
}Widget::~Widget()
{delete ui;
}void Widget::handClick()
{setWindowTitle("修改窗口的标题");qDebug() <<"handClick";
}void Widget::handClicked2()
{setWindowTitle("修改窗口的标题2");qDebug() <<"handClicked2";
}
void Widget::on_pushButton_2_clicked()
{//1、先断开pushButton 的信号槽disconnect(ui->pushButton ,&QPushButton::clicked, this, &Widget::handClick );//2、重新绑定信号槽connect(ui->pushButton ,&QPushButton::clicked, this , &Widget::handClicked2) ;
}
定义槽函数使用lambda
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();private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置一个按钮,并将按钮移动位置QPushButton * button= new QPushButton(this) ;button->setText("按钮" ) ;button->move(200,200) ;//关联信号与槽函数//lambda就是槽函数connect(button ,&QPushButton::clicked , this ,[button,this](){qDebug()<<"lambda被执行了";button->move(500,500) ;this->move(500,500);} );}Widget::~Widget()
{delete ui;
}
相关文章:

信号槽【QT】
文章目录 对象树字符集信号槽QT坐标系信号与槽connect自定义槽自定义信号disconnect 对象树 #ifndef MYLABEL_H #define MYLABEL_H#include<QLabel> class MyLabel : public QLabel { public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWi…...

【UE5 C++课程系列笔记】10——动态单播/多播的基本使用
目录 概念 申明动态委托 一、DECLARE_DYNAMIC_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 绑定动态委托 一、BindDynamic 二、AddDynamic 三、RemoveDynamic 执行动态委托 一、Execute 二、ExecuteIfBound 三、IsBound 四、Broadcast 动态单播使用示…...

点击展示大图预览
原文链接在table表格里能够实现,点击里面的图片实现大图预览的效果; 一、先安装viewer — 使用npm安装 npm install v-viewer --save二、在main.js中引入 import Viewer from v-viewer //点击图片大图预览 import viewerjs/dist/viewer.css Vue.use(…...

【C++】分书问题:深入解析、回溯法高级应用与理论拓展
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯思路与算法回溯法理论基础 💯代码实现与解析完整代码代码关键步骤解析 💯时间复杂度与空间复杂度分析💯理论拓展&…...

java开发入门学习五-流程控制
流程控制语句 if, if...else, if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式,使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…...

【FFmpeg 教程 一】截图
本章使用 ffmpeg 实现观影中经常会用到的功能,截图。 以下给出两种方式。 课程需具备的基础能力:Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…...

北邮,成电计算机考研怎么选?
#总结结论: 基于当前提供的24考研复录数据,从报考性价比角度,建议25考研的同学优先选择北邮计算机学硕。主要原因是:相比成电,北邮计算机学硕的目标分数更低,录取率更高,而且北邮的地理位置优势明显。对于…...

深入了解京东API接口:如何高效获取商品详情与SKU信息
在当今数字化时代,电商平台的数据接口成为了连接商家与消费者的桥梁。京东作为国内领先的电商平台,其API接口为开发者提供了丰富的商品信息获取途径。本文将深入探讨如何使用京东API接口高效获取商品详情与SKU信息,并附上简短而实用的代码示例…...

C++常见内存泄漏案例分析以及解决方案
C 常见内存泄漏案例分析以及解决方案 1. 分配与释放不匹配 在动态内存管理中,使用new操作符分配的内存必须通过delete操作符显式释放。若未遵循这一规则,将导致内存泄漏。例如: int *p new int; p new int; // 错误:未释放先…...

[LeetCode-Python版]206. 反转链表(迭代+递归两种解法)
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3࿱…...

70 mysql 中事务的隔离级别
前言 mysql 隔离级别有四种 未提交读, 已提交读, 可重复度, 序列化执行 然后不同的隔离级别存在不同的问题 未提交读存在 脏读, 不可重复度, 幻觉读 等问题 已提交读存在 不可重复度, 幻觉读 等问题 可重复读存在 幻觉读 等问题 序列化执行 没有以上问题 然后 我们这里…...

C语言二叉树
1.思维导图 树 二叉树 2.将链式队列重新实现一遍 linkqueue.c #include"linkqueue.h" linkqueuePtr create() {linkqueuePtr L(linkqueuePtr)malloc(sizeof(linkqueue));if(NULLL){printf("队列创建失败\n");return NULL;}L->head(nodePtr)malloc(si…...

智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之1
本文要点 深度学习:认知系统架构的处理层 在认知系统架构的设计和代码实现上 需要考虑多个层次,包括感知层、处理层、决策层和执行层。其中 深度学习主要用来解决处理层上的认知问题。 感知层:负责收集外部环境的信息。 处理层:…...

iOS swift开发系列--如何给swiftui内容视图添加背景图片显示
我需要在swiftui项目中显示背景图,有两种方式,一种是把图片拖入asset资源中,另外一种是直接把图片放在源码目录下。采用第一种方式,直接把图片拖到资源目录,但是swiftui项目没有弹出, “Copy items if need…...

jmeter后端监视器
一、概述 JMeter 后端监听器(Backend Listener)是 JMeter 提供的一个功能强大的插件,用于将测试执行期间收集的性能数据发送到外部系统进行监控和分析。通过后端监听器,您可以实时地将 JMeter 测试执行期间收集的数据发送到外部系统,如图形化展示、数据库、数据分析工具等…...

服务器数据恢复—RAIDZ离线硬盘数超过热备盘数导致阵列崩溃的数据恢复案例
服务器存储数据恢复环境: ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组,每组8块硬盘,共组建了3组RAIDZ,每组raid都配置了热备盘。 服务器存储故障: 服务器存储运行过程中突然崩溃,排除人为误操…...

面试题整理4----lvs,nginx,haproxy区别和使用场景
LVS、Nginx、HAProxy:区别与使用场景 1. LVS(Linux Virtual Server)1.1 介绍1.2 特点1.3 使用场景 2. Nginx2.1 介绍2.2 特点2.3 使用场景 3. HAProxy3.1 介绍3.2 特点3.3 使用场景 4. 总结对比 在构建高可用、高性能的网络服务时,…...

iOS - 超好用的隐私清单修复脚本(持续更新)
文章目录 前言开发环境项目地址下载安装隐私访问报告隐私清单模板最后 前言 在早些时候,提交应用到App Store审核,大家应该都收到过类似这样的邮件: Although submission for App Store review was successful, you may want to correct th…...

html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>
1.代码 <ul><li>电话:<a href"tel:18888888888">188-8888-8888</a></li><li>邮箱:<a href"mailto:10000qq.com">10000qq.com</a></li><li>邮箱:<a hre…...

clickhouse-副本和分片
1、副本 1.1、概述 集群是副本和分片的基础,它将ClickHouse的服务拓扑由单节点延伸到多个节点,但它并不像Hadoop生态的某些系统那样,要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活,用户既可以将所有节点组成…...

2009 ~ 2019 年 408【计算机网络】大题解析
2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…...

vue2使用render,js中写html
1、js部分table.js export default {name: "dadeT",data() {return {dades: 6666};},render(h) {return h(div, [h(span, 组件数据:${this.dades}), // 利用data里的dades数据,展示在页面上h(span, 89855545)]);} };2、vue部分 <templat…...

如何有效划分服务器磁盘空间?具体的步骤和流程
有效划分服务器磁盘空间对于提升系统性能、管理方便性和数据安全性至关重要。合理的磁盘分区不仅有助于提高服务器的运行效率,还能在数据恢复、系统故障修复和存储管理方面提供更高的灵活性。以下是如何有效划分服务器磁盘空间的几个关键步骤和注意事项。 磁盘分区的…...

labelme标签批量转换数据集json_to_dataset
文章目录 labelme标签批量转换数据集json_to_dataset转换原理单张图片转换多张图片批量转换bat脚本循环法 标注图片提取标注图片转单通道 labelme标签批量转换数据集json_to_dataset 转自labelme批量制作数据集教程。 转换原理 在安装了labelme的虚拟环境中有一个labelme_js…...

Fisco-Bcos-java-SDK 利用java与fisco-Bcos区块链上的智能合约交互(以HelloWorld为例)
Fisco-Bcos-java-SDK 利用java与fisco-Bcos区块链上的智能合约交互(以HelloWorld为例) 一、部署智能合约 1、编写智能合约 此处用最简单的HelloWorld合约作为例子 包含两个方法和一个构造函数 构造函数:当合约部署的时候 执行构造函数 将…...

OpenHarmony-3.HDF Display子系统(6)
Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者…...

Nginx中Server块配置的详细解析
Nginx中Server块配置的详细解析 一、Server块简介 在Nginx配置文件中,server块是非常关键的部分。它用于定义虚拟主机,一个server块就代表一个虚拟主机。这使得我们可以在一台Nginx服务器上通过不同的配置来处理多个域名或者基于不同端口的服务请求。 …...

php学习资料分享
php学习资料分享:夸克网盘分享...

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3
Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 3_Day5-Day6 (12.15-12.16)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Guid…...

Eureka学习笔记-服务端
Eureka学习笔记 服务端 模块设计 Resources :这部分对外暴露了一系列的 Restful 接口。Eureka Client 的注册、心跳、获取服务列表等操作都需要调用这些接口。另外,其他的 Server 在同步 Registry 时也需要调用这些接口。Controller :这里提…...