QML笔记八
QML与C++交互
QML中调用C++功能、使用QML或者Quick中的C++接口、使用C++实现自定义的QML对象
注:
只有QObject的派生类才能与QML交互
QML引擎集成Qt元对象系统,QObject的派生子类的属性、方法、信号都可以在QML中访问
C++类可以被注册为一个QML实例
C++类可以被注册为一个单例类型,可在QML中导入单例对象
C++类实例可以作为上下文属性或上下文对象嵌入到QML中
1.QML运行时C++类
Qt QML模块实现了QML框架的C++类,客户端可以使用这些类与QML运行时进行交互
以C++为切入点的QML客户端启动时会:
1.客户端初始化一个QQmlEngine
2.使用QQmlComponent对象加载QML文件
3.QML引擎提供一个默认的QQmlContext对象作为顶层执行上下文,用来执行QML文件中定义的函数、表达式;通过QQmlEngine::rootContext获取该上下文
4.若加载QML文件没错时,QML文件的对象将使用QQmlComponent对象的create()创建。
5.所有对象创建完毕,客户端将控制权交给应用程序的事件循环
2.QQmlEngine
2.1提供一个QML引擎,管理qml文件的对象层次结构
2.2提供一个默认上下文,即根上下文,代表执行环境,保证在需要时对象属性可以被更新
2.3允许将全局设置应用到它管理的所有对象
3.QQmlApplicationEngine
是 QQmlEngine的子类,结合了QQmlEngine、QQmlComponent功能
更简便的实现从一个单一的qml文件加载应用程序
提供一些核心应用程序功能,,一般由C++控制
例如:
QQmlQpplicationEngine engine;
engine.load(QStringLiteral(“qrc:/main.qml”))
一般QQmlQpplicationEngine加载的qml文件其根对象应该是widnow或者ApplicationWindow,不然无法显示
若要加载根不是window或其子类的qml文件时使用
QQuickView* view=new QQuickView
view->setSource(QUrl::fromLocalFile(“myqmlfile.qml”))
view->show()
4.QQmlContext
提供了对象实例化和表达式执行所需的上下文
所有对象都要在特定的上下文中实例化
QQmlContext在QML引擎中定义了一个上下文,允许将数据暴露给由QML引擎实例化的QML组件
QQmlContext属性能通过名字将数据显示绑定到上下文,使用setContextProperty()
例如:
QQmlEngine engine;
QStingListModel modelData;
QQmlContext* context = engine.rootContext()
context->setContextProperty(“stringModel”,&modelData)
QQmlContext创建者需要有权去销毁QQmlContext对象 下方例子中context由根上下文中创建了一个新的上下文,modelData被添加到该新的的上下文,
window销毁后,新创建的context必须显示销毁,可以将window作为context父对象,利用QT的对象内存结构自动销毁
例如:
QQmlEngine engine;
QStingListModel modelData;
QQmlContext* context = new QQmlContext(engine.rootContext()) ;
context->setContextProperty(“stringModel”,&modelData) //和下面代码的区别QQmlComponent component(&engin);
component.setData(“importQtQuick;ListView{model:stringModel}”,QUrl());
QObject* window=component.create();在QQmlContext中设置一上下文(按照这样new QQmlContext(engine.rootContext())),上下文对象的是所有属性都可以在context中通过名称访问
使用上下文对象可以更简单快捷维护属性
例如:
class MyDataSet:public QObject
{
Q_PROPERTY(QAbstractItemModel* myModel READ NOTIFY modelChanged)
};
MyDataSet myDataSet;
QQmlEngine engine;
QQmlContext* context=new QQmlContext(engine.rootContext());
context->setContextObject(&myDataSet); //和上面代码的区别QQmlComponent componet(&engine);
componet.setData(“import QtQuick;ListView{model:myModel}”,QUrl());
component.create(context);使用setContextProperty显示设置的属性优先于上下文对象的属性
QQmlEngine engine;
QQmlContext* context1=new QQmlContext(engine.rootContext());
QQmlContext* context2=new QQmlContext(context1); //context2 是context1的子上下文。
context1->setContextProperty(“a”,12);
context1->setContextProperty(“b”,15);
context2->setContextProperty(“5”,15); //context2具有context1的全部属性
5.QQmlComponent
动态对象实例化,
可以使用C++直接创建,也可以通过createComponent在QML中创建
组件是可重用的、具有定义好的对外接口的封装QML类型,
QQmlComponent封装了QML组件的定义,用于加载QML文档,需要QQmlComponent实例化QML的对象例如:
qml
import QtQuick
Item{width:100;height:100}c++
#include
#include
#include
int main(int argc,char* argv[])
{
QCoreApplication a(argc,argv);
QQmlEngine engine;
QQmlComponent component(&engine,Qurl::fromLocalFile(“…/main.qml”));
QObject* myObj=component.create();
QuickItem* item = qobject_cast<QQuickItem*>(myObj);
qreal width = item->width();
return a.exec();
}
如果QQmlComponent要加载网络中的QML文件时,需要先获取到文件才能加载,所以有一个过程,会变成Loading,只有状态变为Ready后才能调用create
void Init(){
QQmlComponent component(&engine,Qurl(“http://www.eample.com/main.qml”));
if(component->isLoading())
{
QObject::connect(component,&QQmlComponent::statusChanged,this,&MyApplication::continuedLoading)
}
else
{
continuedLoading();
}
}void continuedLoading()
{
if(component->isError())
{
qWarning<< component->errors();
}else
{
QObject* myObj = component->create();
}
}
6.QQmlExpression
动态执行表达式
允许客户端在C++中利用一个特定的上下文执行javascript表达式,表达式的结果以QVariant返回
例子:
xx.qml文件
Item{
width:100;height:100
}
C++中
QQmlEngine engine = new QQmlEngine();
QQmlComponent component(engine,QUrl::fromLocalFile(“xx.qml”));
QObject* object=component.create();
QQmlExpression* express = new QQmlExpression(engine->rootContext(),object,“width*2”);
int ret = expression->evaluate().toInt();
7.QML中注册C++类型
7.1 qmlRegisterType
Qt5.14后不在推荐使用qmlRegisterType
7.2 基于宏的注册方式
Qt5.15后使用一组可以添加到类定义中的宏,注册C++,会将类型导出到QML中;QML_ELEMENT:
最重要的宏
可以将所在的类提供给QML作为类型,类型名称就是类名
QML_NAMED_ELEMENT(name)可以自定义类型名例子:
c++文件
#include <QtQml/qqmlregistration.h> //必备
class Backend:public QObject
{
Q_OBJECT
Q_PROPERTY(QString username READ userName WRITE setUserName NOTIFY usernameChanged)QML_ELEMENT //必备
public:
explicit Backend(QObject* parent = nullptr){}
QString username(){return m_userName;}
void setUserName(const QString &userName)
{
m_userName = userName;
emit userNameChanged();
}
signals:
void userNameChanged();
private:
QString m_userName;
};在pro文件中添加如下
CONFIG += qmltypes
QML_IMPORT_NAME=io.qt.examples.backend
QML_IMPORT_MAJOR_VERSION = 1
这样就可以在类型命名控件为《io.qt.examples.backend》中注册版本为1的类型
次要版本将从附加到属性、方法、信号的任何修订中派生,默认次要版本为0,
将QML_ADDED_IN_minor_VERSION()宏添加到类定义中,可以显示的将类型限制为特定的次要版中可用在qml文件中
import QtQuick
import QtQuick.Controls
import io.qt.examples.backend //C++中的类型空间
ApplicationWindow{
id:root
width:100;height:100
visible:true
BackEnd{
id:backend
onUserNameChanged:console.log(backend.userName);
}
Column{
spacing:10
anchors.centerIn:parent
TextField{
placeholderText:qsTr(“User Name”)
onTextChanged:backend.username = text
}
Label{
text:backend.username
width:100;height:100
background:Rectangle{
color:“lightgrey”
}
}
}}
7.3 注册值类型
具有Q_GADGET宏的任何类型都可以注册为QML值类型
Q_GADGET是Q_OBJECT简化版,适用于不从QOBJECT派生,但希望使用QMetaObject的一些功能
可以使用Q_ENUM、Q_PROPERTY、Q_INVOKABLE;但不能使用信号和槽
值类型名称需要小写,
注册方式:QML_VALUE_TYPE或者QML_ANONYMOUS
class Person{
Q_GADGET
Q_PROPERTY(QString firstName READ firstName WRITE setFirstName NOTIFY fierstNameChanged)
Q_PROPERTY(QString lastName READ lastName WRITE setLastName NOTIFY usernameChanged)
QML_VALUE_TYPE(persion) //值类型名称需要小写,
}
使用方式和7.2类似7.4注册不可实例的对象类型
有时候需要将QObject派生类注册为不可实例化的对象类型
符合情况的C++类
- 该类是个接口类型,不应该被实例化
- 该类不需要向QML公开的基类
- 仅声明一些可以从QML访问的枚举
- 是应通过单例提供给QML的类型
QML提供了以下几种方法用于注册非实例化的类型的宏
QML_ANONYMOUS: 注册不可实例化,且无法从QML引用的C++类型
QML_INTERFACE:注册Qt接口类型
QML_UNCREATETABLE(reason):注册一个命名的C++类型,不可实例,但可被QML系统识别,需要搭配QML_ELEMENT或者QML_NAMED_ELEMENT
QML_SINGLETON:注册一个可以从QML导入的单例类型;需要搭配QML_ELEMENT或者QML_NAMED_ELEMENT
单例允许QML使用命名空间访问其属性值、信号、函数,不需要手动实例化一个对象
单例类型不需要和QQmlContext关联,它被所有上下文共享
单例类型由QQmlEngine构造持有,engine销毁该单例销毁
8. 定义QML特定类型、属性
8.1 附加属性
QML中有一个附加属性、附加信号处理器,是附加到一个对象的额外特性
8.2属性修饰符类型
可以作用于QML对象实例的一种属性
属性值设置拦截器:在属性被设置时,用于过滤和改变设置值
属性值源:随时间推移,自动更新值8.3指定QML对象为默认属性、父级属性
Q_CLASSINFO宏和DefaultProperty搭配指定默认属性
class A{
Q_CLASSINFO(“DefaultProperty”,“messages”) //将属性messages设置为默认属性
Q_CLASSINFO(“ParentProperty”,“boadr”) //告诉QML哪个属性表示QML层次结构父对象
}
8.4枚举类型
使用自定义枚举类型,需要先将类注册,枚举使用Q_ENUM()声明
class Message:public QObject
{
Q_OBJECT
Q_PROPERTY(Status staus READ status NOTIFY statusChanged)
public:
enum Status{ready,Loading,Error};
Q_ENUM(Status)
Status status( )const;
signals:
void statusChanged();
}在qml文件中使用
Message
{
onStatusChanged:
{
if(status == Message.Ready)
{
console.log(“Message is loaded”)
}
}
}
9.使用C++属性
QObject的子类或者包含有Q_GADGET宏的类的所有属性都能够被QML访问
可以使用Q_PROPERTY宏定义属性
例子
class Message:public QObject
{
Q_OBJECT
Q_PROPERTY(Status staus READ status NOTIFY statusChanged)
Q_PROPERTY(QString m_author READ author WRITE setAuthor NOTIFY authorChanged)
public:
enum Status{ready,Loading,Error};
Q_ENUM(Status)
Status status( )const;
QString authorconst{return m_author;}
void SetAuthor(const QString& autho)
{
if(autho != m_author)
{
m_author=autho;
emit authorChanged();
}
}
signals:
void statusChanged();
void authorChanged();
private:
QString m_author;
}
cpp文件中
QQuickView view;
Message msg;
view.engine()->rootContext()->setContextProperty(“msg”,&msg);
view.setSource(QUrl::fromLocalFile(MyItem.qml));
view.show();
在qml文件中:
import QtQuick
Text
{
width:100;height:100;
text:msg.author //调用author()
Component.onCompleted:
{
msg.author = “Jonah” //调用SetAuthor()
}
}
10.增强QML、C++交互性,属性都应该显示关联一个NOTIFY属性,属性改变时发射该信号
10.1 对象类型属性
如果类注册到QML,在qml中可以直接使用这个类
class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString m_author READ author WRITE setAuthor NOTIFY authorChanged)
public:
QString authorconst{return m_author;}
void SetAuthor(const QString& autho)
{
if(autho != m_author)
{
m_author=autho;
emit authorChanged();
}
}
signals:
void authorChanged();
private:
QString m_author;
}在qml中直接 Message{}
10.2对象列表属性
如果属性包含QObject子类列表,在QML中访问必须使用QQmlListProperty作为属性类型
class MessageBoadr: public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty messages READ messages)
public:
QQmlListProperty messages()const; //返回一个由QList<Message*> m_messages构造的新的QQmlListProperty对象
{
return QQmlListProperty(this,0,&MessageBoard::append_message);
}
private:
static void append_message(QQmlListProperty* list,Message* msg)
{
MessageBoard* msgBoard=qobject_cast<MessageBoard*>(list->object);
if(msg)
msgBoard->m_messages.append(msg);
}
QList<Message*> m_messages;
}
10.3属性组
属性组用于描述一个类型相关的特征
class MessageAuthor:publicQObject
{
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QString email READ email WRITE setEmail)
}
class Message:public QObject
{
Q_OBJECT
Q_PROPERTY(MessageAuthor* author READ author)
public:
Message(QObject* parent):QObject(parent),m_author(new MessageAuthor(this)){}
MessageAuthor* author()const{return m_author;}
private:
MessageAuthor* m_author;
}Message、MessageAuthor注册到QML后
Message
{
author.name:“aaa”
author.email:“aaa@qq.com”
}
10.4使用函数和槽、信号
QML中可以有条件的访问QObject子类的函数
使用Q_INVOKABLE标记的public函数
public的槽函数
class MessageBoard:public QObject
{
Q_OBJECT
public:
Q_INVOKABLE bool postMessage(const QString &msg)
{
return true;
}
signals:
void newMessagePosted(const QString &subject);
public slots:
void refresh(){}
}cpp
MessageBoard msgBoard
QQuickView view;
view.engine()->rootContext()->setContextProperty(“msgBoard”,&msgBoard);
view->setSource(QUrl::fromLocateFile(“MyItem.qml”));
view.show();qml
import QtQuick
Item
{
width:100;height:100;
MouseArea
{
anchors.fill:parent
onClicked:
{
var result = msgBoard.postMessage(“sss”);
msgBoard.refresh();
}
}onNewMwssagePosted:(subject)=>{}
}
10.5 C++中使用QML
QML可以使用QQmlComponent、QQuickView进行加载;
– QQmlComponent读取到qml后,将其转为c++对象,即可在C++中进行修改
– QQuickView也和QQmlComponent类似,不过由于QQuickView是QWindow的子类,所以被加载的对象还可以进行可视化渲染;
因此,QQuickView用于将一个可视化的QML与应用程序的图形界面整合
Item
{
width:100
height:100
}
使用QQmlComponent
QQmlEngine engine;
QQmlComponent component(&engine,QUrl::fromLocalFile(“main.qml”));
QObject* obj=component.create();
//…
delete obj;获取到QObject后,利用setPorperty、QQmlProperty对其属性修改
obj->setProperty(“width”,500);
QQmlProperty(obj,“width”).write(600)还可以转换成其他类型
QQuickItem* item=qobject_cast<QQuickItem*>(object);
item->setWidth(500);
qDebug()<property(“width”)
使用QQuickView
QQuickView view;
view.setSource(QUrl::fromLocalFile(“main.qml”));
view.show();
QQuickItem* item=view.rootObject();
item->setWidth(500);
qDebug()<width();
10.6 连接QML信号
Item
{
id:item
signal qmlSignal(msg:string)
signal qmlSSignal(obj:Item)
MouseArea
{
anchors.fill:parent
onClicked:
{
item.qmlSignal(“sss”)
item.qmlSSignal(item)
}}
}
class MyClass:public QObject
{
Q_OBJECT
public slots:
void cppSlot(QString msg){}
void cppSlot(QQuickItem* item){}
}main:
QQuickView view(QUrl:;fromLocalFile(“MyItem.qml”));
QObject* item=view.rootObject();
MyClass myClass;
QObject::connect(item,SIGNAL(qmlSignal(QString)),&myClass,SLOT(cppSlot(QSting)));
QObject::connect(item,SIGNAL(qmlSignal(QVariant)),&myClass,SLOT(cppSlot(QVariant)));view.show();
相关文章:

QML笔记八
QML与C交互 QML中调用C功能、使用QML或者Quick中的C接口、使用C实现自定义的QML对象 注: 只有QObject的派生类才能与QML交互 QML引擎集成Qt元对象系统,QObject的派生子类的属性、方法、信号都可以在QML中访问 C类可以被注册为一个QML实例 C类可以被注册为…...

运维别卷系列 - 云原生监控平台 之 00.prometheus 监控汇总
以下是 运维别卷系列 - 云原生监控平台 相关的详细文章链接,相应的内容,也只是用来做入门使用的 运维别卷系列 - 云原生监控平台 之 01.prometheus 入门和部署运维别卷系列 - 云原生监控平台 之 02.prometheus exporter 实践运维别卷系列 - 云原生监控平…...

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)
1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构,有利于找到目标网络的关键节点,从而提高攻击效率,达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统,确认目标系统适合哪种类型的攻击。 3、百度…...

【python量化交易】—— Alpha选股策略 - Qteasy自定义交易策略【附源码】
使用qteasy创建并回测Alpha选股交易策略 使用qteasy创建并回测Alpha选股交易策略策略思想第一种自定义策略设置方法,使用持仓数据和选股数据直接生成比例交易信号PS信号:第二种自定义策略设置方法,使用PT交易信号设置持仓目标:第三…...

简单记录下:Navicat 导出表结构至 Excel
首先我们需要通过sql语句查询出相关的表结构的结构 SELECT COLUMN_NAME AS 字段名称,COLUMN_TYPE AS 字段类型,IF(IS_NULLABLENO,否,是) AS 是否必填,COLUMN_COMMENT AS 注释FROM INFORMATION_SCHEMA.COLUMNSWHERE table_schema bs-gdsAND table_name sys_menu;查询的结构如下…...

黑马基于Web-socket的java聊天室基本解析
要是用Web-socket协议,我们要前端upgrade升级成web-socket协议 首先我们要引入springboot的websocket起步依赖,这样子方便使用,自己指定版本注意 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...

【操作系统期末速成】内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换
🎥 个人主页:深鱼~🔥收录专栏:操作系统🌄欢迎 👍点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…...

图和网络笔记
文章目录 1. A X 0 AX0 AX02. A T Y 0 A^TY0 ATY03. A X 0 AX0 AX0和 A T Y 0 A^TY0 ATY0的关系 1. A X 0 AX0 AX0 一个图可以由节点和边组成,假设我们有一个节点notes :n4,边edges:m5的有向图,表示如下 通过以上电路…...

请求外部系统报错
报错信息: nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()Ljava/lang/String; 在网上看了好几篇文章,和我的都不符合。 后面自己发现是我的系…...

电路板维修【四】
【开关电源输出电压偏低不稳,用示波器立马锁定故障范围】:https://www.bilibili.com/video/BV1pf421D73K?vd_source3cc3c07b09206097d0d8b0aefdf07958 可以用示波器查看MOS的输出波形来查看其是否损坏: 电源芯片的供电电压来回跳变…...

(程序设计语言)传值、传引用
1、传值(传递值): 在传值的情况下,函数接收到的是参数的一个副本,而不是参数本身。这意味着函数内部对参数的修改不会影响到原始值。传值通常用于基本数据类型(如整数、浮点数、布尔值等)的传递…...

一次基类类型对象无法被传递问题的分析
看下面一段代码: // proj2.cpp #include <iostream> using namespace std; class CharShape { public:CharShape(char ch) : _ch(ch) {};virtual void Show() 0; protected:char _ch; // 组成图形的字符 }; class Triangle : public CharShape { public:Tr…...

windows设置Redis服务后台自启动
问题 在日常开发过程中,redis是我们常用的缓存工具,但是由于redis对于Linux系统进行开发的,在Linux系统里可以通过修改redis.conf从而从而实现后台启动。 daemonize no 改成 daemonize yes 但是在window上如何也进行后台运行呢,…...

掌握Linux常用命令,扫平面试需求障碍
cd 切换目录。 > cd ../ #切换到父级目录 > cd /tmp # 切换到/tmp目录 > cd ~ # 切换到当前用户的家目录 ls命令 查看文件与目录的命令,list 的缩写。 > ls -l #列出长数据串,包含文件的属性与权限数据等 > ls -a #列出隐藏…...

c语言之文件打开模式
在c语言中,文件打开模式如下 r读模式: 允许对文件读取信息。若文件不存在,则会报错 w写模式: 允许向文件写入信息,若文件不存在,则创建一个文件 #include<stdio.h>int main() {FILE *fp;int i;char ay;fpfo…...

与禹老师学前端vue3学习汇总
24.5.15: 创建Vue3工程 1.确定自己电脑有没有nodejs环境,在cmd中输入node,如果出现Node.js的版本号说明已经有这个环境了,否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study,然后在这个空文件夹中右键选择终端…...

Linux网络编程——HTTP协议的理解与运用
目录 前言 一、认识URL 二、认识HTTP样例 三、HTTP的报头内容 1.url 2. Content-Type 3.Method 方法 1.GET方法 2.POST方法 4、状态码 5.cookie和session 前言 我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们…...

RestTemplate接口请求发送json、form数据格式以及处理接口错误状态码400 null
在使用RestTemplate发送HTTP请求时,你可以通过不同的方式发送JSON或表单数据(application/x-www-form-urlencoded)。同时,处理接口错误状态码(如400)和返回null的情况也是很重要的。以下是一些示例代码&…...

《Python编程从入门到实践》day29
# 昨日知识点回顾 修改折线图文字和线条粗细 矫正图形 使用内置格式 # 今日知识点学习 15.2.4 使用scatter()绘制散点图并设置样式 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg)plt.style.use(seaborn-v0_8) # 使用内置格式 fig, ax plt.subpl…...

UIKit之图片浏览器
功能需求 实现一个图片浏览器,点击左右按钮可以切换背景图,且更新背景图对应的索引页和图片描述内容。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言,故创建cocoa Touch类…...

如何查看SNMP设备的OID
什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树,其级别由不同的组织分配。MIB MIB(管理信息基)提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…...

什么?你设计接口什么都不考虑?
如果让你设计一个接口,你会考虑哪些问题? 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制 返回值是否为空,如果为空的时候是…...

2024年3月 青少年等级考试机器人理论真题二级
202403 青少年等级考试机器人理论真题二级 第 1 题 一个机器小车,用左右两个电机分别控制左右车轮,左侧电机转速是100rpm,右侧电机转速是50rpm,则此机器小车?( ) A:原地右转 B&am…...

C语言学习【printf函数和scanf函数】
C语言学习【printf函数和scanf函数】 printf()函数和scanf()函数可以让用户与程序交流,是输入/输出函数 printf()函数 请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称…...

shell正则表达式
sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 sort 对行内容进行升序排序 XXX | sort 选项 sort 选项 文件 常用选项&#x…...

react组件渲染性能优化之函数组件-useCallback使用
useCallback主要就是对函数进行缓存,useCallBack这个Hooks主要是解决React.memo不能缓存事件的问题 useCallBack(fn, dependencies) :fn想要缓存的函数,dependencies有关是否更新 fn 的所有响应式值的一个列表 比如:UseCallBackOptimize组件…...

【C++】:string类的基本使用
目录 引言一,string类对象的常见构造二,string类对象的容量操作三,string类对象的访问及遍历操作四,string类对象的修改操作五,string类非成员函数六,整形与字符串的转换 引言 string 就是我们常说的"…...

多线程的代码案例
目录 单例模式 饿汉模式 懒汉模式 阻塞队列 生产者消费者模型意义: 阻塞队列使用方法 实现阻塞队列 阻塞队列实现生产者消费者模型 定时器 实现简单的定时器 工厂模式 线程池 为啥呢? 从池子里面取 比 创建线程 效率更高 线程池的创建 怎么填坑 ThreadPoolExec…...

什么是Java中的设计模式?请列举几种常见的设计模式
一、引言 在软件开发中,设计模式是解决特定设计问题的最佳实践或通用解决方案。Java作为一种广泛使用的编程语言,其设计模式在软件设计和架构中起着至关重要的作用。设计模式不仅提高了代码的可读性和可维护性,还使得代码更加灵活和可扩展。…...

绘制奇迹:Processing中的动态图形与动画
🚀 欢迎回到Processing的世界,你的艺术编程航程刚刚开始。在我们的入门篇中,你已经学会了如何用Processing绘制基本的静态图形。现在,让我们一起探索Processing强大的动态图形和动画功能,释放你的创造力,走…...