C++客户端Qt开发——常用控件(输入类控件)

4.输入类控件

①Line Edit 单行输入框

属性

说明

text

输入框中的文本

input

输入内容格式约束

maxLength

最大长度

frame

是否添加边框

echoMode

显示方式

QLineEdit::Normal:这是默认值,文本框会显示输入的文本。

QLineEdit::Password:在这种模式下,输入的字符会被隐藏,通常用星号(*)或等号(=)代替。

QLineEdit::NoEcho:在这种模式下,文本框不会显示任何输入的字符。

cursorPosition

光标所在位置

alignment

文字对齐方式,设置水平和垂直方向的对齐

dragEnabled

是否允许拖拽

readOnly

是否是只读的(不允许修改)

placeHolder

当输入框内容为空的时候,显示什么样的提示信息

clearButtonEnabled

是否会自动显示出“清除按钮”

核心信号

属性

说明

void CursorPositionChanged(int old,int new)

当鼠标移动时发出此信号,old为先前的位置,new为新位置。

void editingFinished()

当按返回或者回车键时,或者行编辑失去焦点时,发出此信号。

void returnPressed()

当返回或回车键按下时发出此信号

如果设置了验证器,必须要验证通过,才能触发

void selectionChanged()

当选中的文本改变时,发出此信号。

void textChanged(const QString &text)

当QLineEdit中的文本改变时,发出此信号,text是新的文本

代码对文本的修改能够触发这个信号

void textEdited(const QString &text))

当QLineEdit中的文本改变时,发出此信号,text是新的文本

代码对文本的修改不能触发这个信号

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
//#include<stdio.h>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
//    printf("hello");//初始化第一个输入框,用来输入姓名ui->lineEdit_name->setPlaceholderText("请输入姓名");ui->lineEdit_name->setClearButtonEnabled(true);//初始化第二个输入框,用来输入密码ui->lineEdit_password->setPlaceholderText("请输入密码");ui->lineEdit_password->setClearButtonEnabled(true);//把显示模式设置成显示密码的模式ui->lineEdit_password->setEchoMode(QLineEdit::Password);//初始化第三个输入框ui->lineEdit_phone->setPlaceholderText("请输入手机号");ui->lineEdit_phone->setClearButtonEnabled(true);//手机号有固定格式,此处的0代表数字ui->lineEdit_phone->setInputMask("000-0000-0000");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_submit_clicked()
{QString gender = ui->radioButton_nan->isChecked()?"男" :"女";qDebug()<<"姓名"<<ui->lineEdit_name->text()<<"密码"<<ui->lineEdit_password->text()<<"性别"<<gender<<"电话"<<ui->lineEdit_phone->text();
}

正则表达式:

正则表达式是一种在计算机中常用的,使用特殊字符描述一个字符串的特征的机制.在进行字符串匹配时非常有用

正则表达式的语法还比较复杂,一般都是随用随查,不需要背下来

参考:

正则表达式语法 | Microsoft Learn

正则表达式在线工具:

正则表达式语法测试工具 - 在线工具

①验证用户在单行输入框中输入的文本是否符合特定的正则表达式模式

(尝试输入字母是无法输入,且只能输入11位)

#include "widget.h"
#include "ui_widget.h"
#include<QRegExpValidator>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给单行输入框设置验证器,基于正则表达式来完成验证目的ui->pushButton->setEnabled(false);QRegExp regExp("^1\\d{10}$");ui->lineEdit->setValidator(new QRegExpValidator(regExp));}Widget::~Widget()
{delete ui;
}void Widget::on_lineEdit_textEdited(const QString &text)
{QString content = text;int pos = 0;if (ui->lineEdit->validator()->validate(content,pos)){//验证通过ui->pushButton->setEnabled(true);}else{//验证不通过ui->pushButton->setEnabled(false);}
}

正则表达式 "^1\\d{10}$"

  1. ^:这个符号表示匹配字符串的开始位置。
  2. 1:这个数字表示匹配字符'1'。在这个正则表达式中,它指定了字符串必须以数字'1'开头。
  3. \\d:\d是一个正则表达式中的特殊字符,表示匹配任何一个阿拉伯数字(0-9)。由于在Qt中,反斜杠\是一个转义字符,所以在字符串中使用它需要进行转义,因此我们使用\\d来表示\d。
  4. {10}:这个花括号表示前面的表达式(这里是\d)需要重复10次。因此,\\d{10}表示匹配10个数字。
  5. $:这个符号表示匹配字符串的结束位置。

②验证两次输入的密码一致

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->label->setText("请输入密码,两次密码要填写一致!");ui->lineEdit->setEchoMode(QLineEdit::Password);ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}Widget::~Widget()
{delete ui;
}void Widget::on_lineEdit_textEdited(const QString &arg1)
{(void) arg1;const QString& s1 = ui->lineEdit->text();const QString& s2 = ui->lineEdit_2->text();if(s1.isEmpty() && s2.isEmpty()){ui->label->setText("密码为空!");}else if(s1 == s2){ui->label->setText("两次输入的密码相同!");}else{ui->label->setText("两次输入的密码不相同!");}
}void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{(void) arg1;const QString& s1 = ui->lineEdit->text();const QString& s2 = ui->lineEdit_2->text();if(s1.isEmpty() && s2.isEmpty()){ui->label->setText("密码为空!");}else if(s1 == s2){ui->label->setText("两次输入的密码相同!");}else{ui->label->setText("两次输入的密码不相同!");}
}

lineEdit和lineEdit_2的代码完全相同,在开发过程中建议封装成一个函数然后再调用该函数,这样只需写一遍,且能多次利用

在槽函数中,argl未被用到,这样的话编译器会出现警告,可以在函数内部添加(void) arg1;绕过编译器检查

切换显示密码

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置初始状态ui->lineEdit->setEchoMode(QLineEdit::Password);}Widget::~Widget()
{delete ui;
}void Widget::on_checkBox_toggled(bool checked)
{if(checked){// true则是显示密码状态,就会把输入框的显示模式切换为normalui->lineEdit->setEchoMode(QLineEdit::Normal);}else{// false则是隐藏密码状态,就会把输入框的显示模式切换为Passwordui->lineEdit->setEchoMode(QLineEdit::Password);}
}

②TextEdit 多行输入框&Markdown富文本编辑器

能在内容超出编辑框范围时自动提供滚动条

属性

说明

markdown

输入框内持有的内容,支持markdown格式,能够自动的对markdown文本进行渲染成html

html

输入框内持有的内容,可以支持大部分html标签,包括img和table等

palceHolderText

输入框为空时提示的内容

readOnly

是否是只读的

undoRedoEnable

是否开启undo/redo功能

按下ctrl+z触发undo

按下ctrl+y触发redo

autoFormating

开启自动格式化

tabstopWidth

按下缩进占多少空间

overwriteMode

是否开启覆盖写模式

acceptRichText

是否接收富文本内容

verticalScrollBarPolicy

垂直方向滚动条的出现策略

  • Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条。这是默认值。
  • Qt::ScrollBarAlways0ff:总是关闭滚动条。
  • Qt::ScrollBarAlwayson:总是显示滚动条。

horizontalScrollBarPolicy

水平方向滚动条的出现策略

  • Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条。这是默认

值。

  • Qt::ScrollBarAlways0ff:总是关闭滚动条。
  • Qt::ScrollBarAlwaysOn:总是显示滚动条。

核心信号

信号

说明

textChanged()

文本内容改变时触发

selectionChanged()

选中范围改变时触发

cursorPositionChanged()

光标移动时触发

undoAvailable(bool)

可以进行undo操作时触发

redoAvailable(bool)

可以进行redo操作时触发

copyAvailable(bool)

文本被选中/取消选中时触发

①获取到多行输入框的内容

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_textEdit_textChanged()
{//获取到内部的文本const QString& content = ui->textEdit->toPlainText();qDebug() << content;ui->label->setText(content);
}

②验证输入框的各种信号

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_textEdit_textChanged()
{qDebug() << "[textChanged] " << ui->textEdit->toPlainText();
}void Widget::on_textEdit_selectionChanged()
{//获取光标选中内容const QTextCursor& cursor = ui->textEdit->textCursor();qDebug() << "[selectionChanged] " << cursor.selectedText();
}void Widget::on_textEdit_cursorPositionChanged()
{//获取光标内容const QTextCursor& cursor = ui->textEdit->textCursor();qDebug() << "[cursorPositionChanged] " << cursor.position();
}void Widget::on_textEdit_undoAvailable(bool b)
{qDebug() << "[undoAvailable] " << b;
}void Widget::on_textEdit_redoAvailable(bool b)
{qDebug() << "[redoAvailable] " << b;
}void Widget::on_textEdit_copyAvailable(bool b)
{qDebug() << "[copyAvailable] " << b;
}

③ComboBox 下拉框

属性

说明

currentText

当前选中的文本

currentIndex

当前选中的条目下标

从0开始计算,如果当前没有条目被选中,值为-1

editable

是否允许修改

设为true时,QComboBox的行为就非常接近QLineEdit,也可以设置validator

iconSize

下标框图标(小三角)的大小

maxCount

最多允许有多少个条目

核心方法

方法

说明

addltem(const QString)

添加一个条目

currentIndex()

获取当前条目的下标

从0开始计算,如果当前没有条目被选中,值为-1

currentText()

获取当前条目的文本内容

核心信号

方法

说明

activated(int)

activated(const QString &text)

当用户选择了一个选项时发出

这个时候相当于用户点开下拉框,并且鼠标划过某个选项

此时还没有确认做出选择

currentIndexChanged(int)

currentIndexChanged(const QString &text)

当前选项改变时发出

此时用户已经明确了一个选项

用户操作或者通过程序操作都会触发这个信号

editTextChanged(const QString &text)

当编辑框中的文本改变时发出

(editable为true时有效)

①使用下拉框模拟麦当劳点餐

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox_2->addItem("薯条");ui->comboBox_2->addItem("麦辣鸡腿");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{qDebug() << "汉堡选择" << ui->comboBox->currentText();qDebug() << "小食选择" << ui->comboBox_2->currentText();qDebug() << "饮料选择" << ui->comboBox_3->currentText();
}

②从文件中加载下拉框的选项

#include "widget.h"
#include "ui_widget.h"
#include <fstream>
//注意头文件!!!
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//std::ifstream file("./config.txt");//相对路径,此时文件不是在D:\C C++\program\QT\ComboBox_2这个目录下//而是在运行程序目录"D:\C C++\program\QT\build-ComboBox_2-Desktop_Qt_5_14_0_MinGW_64_bit-Debug\config.txt"下std::ifstream file("D:/config.txt");if (!file.is_open()) {qDebug() << "Failed to open file";return;}std::string line;while(std::getline(file,line)){ui->comboBox->addItem(QString::fromStdString(line));}file.close();
}Widget::~Widget()
{delete ui;
}

Qt中也提供了QFile实现读写文件的功能.当然使用C++标准库的std:fstream也是完全可以的.

之所以存在两套,是因为Qt诞生较早(1991年左右),此时C+还没有完成"标准化"的工作,C++标准库这样的概念自然也没有诞生,

因此Qt就自己打造了一套库,实现了字符串,容器,文件操作,多线程,网络操作,定时器,正则表达式等内容.

(由于C++标准委员会的不作为,至今仍然有些Qt提供的功能,是标准库不具备的)

④SpinBox 微调框(带按钮的输入框)

SpinBoxQDoubleSpinBox用法基本相同

Spin英文原意为"旋转"此处引申成"微调".

事实上很多术语在翻译的时候,不一定非要按照原始的翻译来表示,更追求的是"信达雅"

举个例子,地铁上的"Priority Seat'"会翻译成"爱心专座”,而不是"优先座位".

属性

说明

value

存储的数值

singleStep

每次调整的“步长”,按下一次按钮数据变化多少

displayInterger

数字的进制,例如displayInteger设为10,则是按照10进制表示,设为2,则为2进制表示

minimum

最小值

maximum

最大值

suffix

后缀

prefix

前缀

wrapping

是否允许换行

frame

是否带边框

alignment

文字对齐方式

readOnly

是否允许修改

buttonSymbol

按钮上的图标

UpDownArrows:上下箭头形式

PlusMinus:加减号形式

NoButtons:没有按钮

accelerated(加速的)

按下按钮时是否为快速调整模式

correctionMode

输入有误时如何修正,

QAbstractSpinBox::CorrectToPreviousValue:如果用户输入了一个无效的值(例如,在只能显示正整数的SpinBox中输入了负数),那么SpinBox会恢复为上一个有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),然后SpinBox会恢复为1。

QAbstractSpinBox::CorrectToNearestValue:如果用户输入了一个无效的值,SpinBox会恢复为最接近的有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),那么SpinBox会恢复为0。

keyboardTrack

是否开启键盘跟踪,

设为true,每次在输入框输入一个数字,都会触发一次valueChanged()textChanged()信号.

设为false,只有在最终按下enter或者输入框失去焦点,才会触发valueChanged()textChanged()信号

核心信号

属性

说明

textChanged(QString)

微调框的文本发生改变时会触发

参数QString带有前缀和后缀

valueChanged(int)

微调框的文本发生改变时会触发

参数int,表示当前的数值

①调整麦当劳购物车中的份数

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox_2->addItem("薯条");ui->comboBox_2->addItem("麦辣鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");//初始化微调框ui->spinBox->setValue(1);ui->spinBox->setRange(1,5);ui->spinBox_2->setValue(1);ui->spinBox_2->setRange(1,5);ui->spinBox_3->setValue(1);ui->spinBox_3->setRange(1,5);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{qDebug() << "当前下单:"<< ui->comboBox->currentText() << ":" << ui->spinBox->value()<< ui->comboBox_2->currentText() << ":" << ui->spinBox_2->value()<< ui->comboBox_3->currentText() << ":" << ui->spinBox_3->value();
}

⑤Data Edit & Time Edit 日期时间微调框

属性

说明

dataTime

时间日期的值,形如2000/1/1 0:00:00

data

单纯日期的值,形如2001/1/1

time

单纯时间的值,形如0:00:00

displayFormat

时间日期格式,形如yyyy/M/d H:mm

y:表示年份

M:表示月份

d:表示日期

H:表示小时

m:表示分钟

s:表示秒

注意:这里的格式化符号的含义,不要记忆.不同语言/库的设定规则是存在差异的,一定是用的时候再去查

minimumDateTime

最小时间日期

maximumDateTime

最大时间日期

timeSpec

Qt:LocalTime:显示本地时间。

Qt:UTC:显示协调世界时(UTC)

Qt:OffsetFromUTC:显示相对于UTC的偏移量(时差)

关于本地时间(LocalTime)和协调世界时(UTC)

UTC时间是一个基于原子钟的标准时间.不受地球的自转周期影响.和格林威治时间(GMT)是非常接近的.科学家会通过精密的设备来测量并维护

咱们的计算机内部使用的时间就是基于UTC时间

本地时间则是基于不同的时区,对UTC时间做出了一些调整.比如咱们使用的北京时间,位于"东八区”,就需要在UTC时间基础上+8个小时的时差,

核心信号

信号

说明

dateChanged(QDate)

日期改变时触发

timeChanged(QTime)

事件改变时触发

dateTimeChanged(QDateTime)

时间日期任意一个改变时触发

①实现日期计算器

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取到两个时间框的时间和日期QDateTime timeold = ui->dateTimeEdit_old->dateTime();QDateTime timenew = ui->dateTimeEdit_new->dateTime();//计算日期差值int days = timeold.daysTo(timenew);int hours = (timeold.secsTo(timenew)/3600) % 24;//设置 label的内容QString text = QString("在一起已经 ") + QString::number(days) + QString(" 天 零 ") + QString::number(hours) + QString(" 个小时!");ui->label->setText(text);
}

⑥Dial 旋钮

属性

说明

value

持有的数值

minimum

最小值

maximum

最大值

singleStep

按下方向键的时候改变的步长

pageStep

按下pageUp/pageDown的时候改变的步长

sliderPosition

界面上旋钮显示的初始位置

tracking

外观是否会跟踪数值变化

默认值为true,一般不需要修改

wrapping

是否允许循环调整

即数值如果超过最大值,是否允许回到最小值

(调整过程中能否套圈)

notchesVisible

是否显示刻度线

notchTarget

刻度线之间的相对位置

数字越大,刻度线越稀疏

核心信号

属性

说明

valueChanged(int)

数值改变时触发

rangeChanged(int,int)

范围变化时触发

①调整窗口透明度

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置可以循环旋转ui->dial->setWrapping(true);//设置刻度线可见ui->dial->setNotchesVisible(true);//设置最大值为ui->dial->setMaximum(100);//设置最小值为ui->dial->setMinimum(0);//设置初始值为ui->dial->setValue(100);}Widget::~Widget()
{delete ui;
}void Widget::on_dial_valueChanged(int value)
{ui->label->setText(QString("当前不透明度为: ") + QString::number(value));this->setWindowOpacity((double)value / 100);
}

⑦Slider 滑动条

QSlider 和 QDial 都是继承自 QAbstractSlider,因此用法上基本相同。

属性

说明

value

持有的数值

minimum

最小值

maximum

最大值

singleStep

按下方向键的时候改变的步长

pageStep

按下pageUp/pageDown的时候改变的步长

sliderPosition

界面上旋钮显示的初始位置

tracking

外观是否会跟踪数值变化

默认值为true,一般不需要修改

orientation

滑动条的方向是水平还是垂直

invertedAppearance

是否要反转滑动条的位置

tickPosition

刻度的位置

tickInterval

刻度的密集程度

核心信号

属性

说明

valueChanged(int)

数值改变时触发

rangeChanged(int,int)

范围变化时触发

objectName分别为

水平:horizontalSlider

垂直:verticalSlider

①调整窗口大小

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->horizontalSlider->setMinimum(500);ui->horizontalSlider->setMaximum(2000);ui->horizontalSlider->setSingleStep(100); //按下方向键的时候改变的步长ui->horizontalSlider->setValue(800);ui->verticalSlider->setMinimum(500);ui->verticalSlider->setMaximum(1500);ui->verticalSlider->setSingleStep(100); //按下方向键的时候改变的步长ui->verticalSlider->setValue(600);//翻转朝向,默认滑块从上往下增长ui->verticalSlider->setInvertedAppearance(true);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{QRect rect = this->geometry();this->setGeometry(rect.x(),rect.y(),value,rect.height());qDebug()<<value;
}void Widget::on_verticalSlider_valueChanged(int value)
{QRect rect = this->geometry();this->setGeometry(rect.x(),rect.y(),rect.width(),value);qDebug()<<value;
}

②通过自定义快捷键调整滑动条位置

#include "widget.h"
#include "ui_widget.h"
#include<QShortcut> // 设置快捷键Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->label->setText("");ui->horizontalSlider->setMinimum(0);ui->horizontalSlider->setMaximum(100);ui->horizontalSlider->setSingleStep(10);ui->horizontalSlider->setValue(0);QShortcut* shortCut1 = new QShortcut(this);shortCut1->setKey(QKeySequence("-"));connect(shortCut1,&QShortcut::activated,this,&Widget::subValue);QShortcut* shortCut2 = new QShortcut(this);shortCut2->setKey(QKeySequence("="));connect(shortCut2,&QShortcut::activated,this,&Widget::addValue);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{ui->label->setText(QString::number(value));
}void Widget::subValue()
{int value = ui->horizontalSlider->value();ui->horizontalSlider->setValue(value-20);
}void Widget::addValue()
{int value = ui->horizontalSlider->value();ui->horizontalSlider->setValue(value+20);
}

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

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

相关文章

C++客户端Qt开发——常用控件(多元素控件)

5.多元素控件 Qt中提供的多元素控件有&#xff1a; QListWidget QListView QTablewidget QTableview QTreewidget QTreeview xxWidget和xView之间的区别 以QTableWidget和QTableView为例. QTableView是基于MVC设计的控件.QTableView自身不持有数据.使用QTableView的时候需要…

Django任务管理

1、用django-admin命令创建一个Django项目 django-admin startproject task_manager 2、进入到项目下用命令创建一个应用 cd task_manager python manage.py startapp tasks 3、进入models.py定义数学模型 第2步得到的只是应用的必要空文件&#xff0c;要开始增加各文件实际…

STM32(五):STM32指南者-按键控制灯开关实验

说明&#xff1a;源代码和教程可从野火处下载&#xff0c;本博客为了记录学习过程STM32&#xff08;四&#xff09;&#xff1a;STM32指南者-跑马灯实验的基础上 一、采用轮询方式1、bsp_key.h2、bsp_key.c3、main.c 二、采用中断方式1、bsp_exti.h2、bsp_exti.c3、stm32f10x_i…

AI写作不懂提示词 大象Prompt 保姆级系列教程三

一、提示词的核心价值究竟是啥&#xff1f; 最近跟不少业内朋友探讨这事儿&#xff0c;我觉得&#xff1a;提示词的核心价值在于对方法论的封装以及由此带来的知识传播速度加快。 通俗讲&#xff0c;假如你熟悉的行业里有个厉害的“老师傅”&#xff0c;他在核心业务上有好多心…

jvm 07 GC算法,内存池

01 垃圾判断算法 1.1引用计数算法 最简单的垃圾判断算法。在对象中添加一个属性用于标记对象被引用的次数&#xff0c;每多一个其他对象引用&#xff0c;计数1&#xff0c; 当引用失效时&#xff0c;计数-1&#xff0c;如果计数0&#xff0c;表示没有其他对象引用&#xff0c;…

架构设计-NX的二次开发API架构设计介绍

1.与整体的关系 2.API设计目标 能够允许用户访问NX的所有UI工具组件&#xff0c;二次开发用户能够编写外观和运行行为类似NX的应用程序。能够允许用户直接访问NX数据模型即使底层数据结构和功能实现发生很大变化&#xff0c;API接口保持稳定&#xff0c;不会影响上层用户。 3…

ARM架构(一)—— ARMV8V9基础概念

目录 1.ARMCore的时间线2.ARM术语小结2.1 A64和arrch642.2ARM架构现在的5个系列2.3 微架构2.4 PE2.5 Banked2.6 ARM文档术语2.7 IMPLEMENTATION DEFINFD 和 DEPRECATED2.8 EL1t和EL1h 3 ARMv7的软件架构4 安全状态切换模型4.1 Secure state和Non-secure state介绍 5 Interproce…

设计师必备:将复杂逻辑做成可视化图表,别说你不会,看过来。

将复杂逻辑做成可视化图可以帮助人们更直观地理解和分析复杂的关系和流程。以下是一般步骤&#xff1a; 1.确定目的&#xff1a; 首先需要明确制作可视化图的目的是什么&#xff0c;是为了展示数据的关系、流程的步骤、还是其他目的。不同的目的会对可视化图的设计和展示方式…

如何在Linux系统上查找以太网卡驱动名称及其版本

说明 目录&#xff1a; 通过dmesg命令查看驱动名称及版本 通过ethtool命令查看驱动名称及版本 通过lshw命令查看驱动名称及版本 要使网卡硬件能够正常的运行&#xff0c;需要在Linux操作系统上提供合适的驱动程序&#xff0c;例如&#xff1a;用于intel网卡的ixgbe驱动。网卡…

FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

其实代码没有问题&#xff0c;但是我们忽略了一个问题&#xff0c;就是在正常的开发中&#xff0c;肯定是遇到过这样的情况&#xff0c;我们频繁的有客户端链接&#xff0c;断开连接&#xff0c;需要统一的管理这些链接&#xff0c;那么应该如何管理呢。其实可以声明一个类去管…

怎样优化 PostgreSQL 中对复杂的排序规则和排序方向的查询?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样优化 PostgreSQL 中对复杂的排序规则和排序方向的查询一、理解复杂排序规则和排序方向二、优化索引…

vue前端实现导出页面为word(两种方法)

将vue页面导出为word文档&#xff0c;不用写模板&#xff0c;直接导出即可。 第一种方法(简单版) 第一步&#xff1a;安装所需依赖 npm install html-docx-js -S npm install file-saver -S第二步&#xff1a;创建容器&#xff0c;页面使用方法 注意&#xff1a;在当前页面引…

Linux进程信号总结

目录 信号入门 生活中的信号 技术应用角度的信号 信号的发送与记录 信号处理常见方式概述 产生信号 通过终端按键产生信号 通过系统函数向进程发信号 由软件条件产生信号 ​编辑 由硬件异常产生信号 阻塞信号 信号其他相关常见概念 在内核中的表示 sigset_t …

输出调节求解跟踪问题(二阶线性系统)

本文研究了一种基于增广系统的领导者-跟随者控制框架&#xff0c;旨在实现跟随者系统对领导者参考信号的精确跟踪。首先&#xff0c;建立了跟随者和领导者的独立状态空间方程&#xff0c;分别描述了它们的动态行为和输出关系。随后&#xff0c;通过将两者的状态空间方程结合成增…

在Windows环境下安装pycharm

Python环境搭建 第一步下载安装python 等待安装完成 验证python是否安装成功 Python开发工具安装部署 JetBrains: Essential tools for software developers and teams PyCharm: the Python IDE for data science and web development 下载社区版本的PyCharm 双击打开下载好的…

【运维资料大全】运维全套资料整理(word原件完整版)

信息安全类、运维类资料整合&#xff1a; 1. 等保测评模板 2. 安全检查表&#xff08;IDS&#xff0c;Linux&#xff0c;数据库&#xff0c;Tomcat&#xff0c;防火墙等&#xff09; 3. 服务器安全巡检表 4. 网络定向攻击风险分析表 5. 应用系统常规检测表 6. 企业漏洞管理50个…

TS 入门(三):Typescript函数与对象类型

目录 前言回顾1. 函数类型a. 基本函数类型b. 可选参数和默认参数c. 剩余参数 2. 对象类型a. 基本对象类型b. 可选属性和只读属性 3. 类型别名和接口a. 类型别名b. 接口扩展 4. 类型推断和上下文类型a. 类型推断b. 上下文类型 扩展知识点&#xff1a;函数重载结语 前言 在前两章…

【银河麒麟操作系统】虚机重启lvs丢失现象分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 环境及现象描述 40台虚机强制重启后&#xff0c;其中8台虚机找不到逻辑卷导致启动异常&#xff0c;后续通过pvcreate 修复重建pv&#xff0c;激活vg和lv并修复…

WSL-Ubuntu20.04训练环境配置

1.YOLOv8训练环境配置 训练环境配置的话就仍然以YOLOv8为例&#xff0c;来说明如何配置深度学习训练环境。这部分内容比较简单&#xff0c;主要是安装miniAnaconda以及安装torch和torchvision. 首先是miniAnaconda的安装(参考官网的教程Miniconda — Anaconda )&#xff0c;执行…

CH552G使用IAP下载

常见下载中的方式ISP&#xff0c;IAP&#xff0c;ICP 参考&#xff0c;CH552G中文手册&#xff0c;参考1 ISP&#xff1a;In System Programing&#xff0c;在系统编程。是常见的&#xff0c;使用软件&#xff0c;先将某个引脚&#xff08;例如boot&#xff09;连接到合适的电…