qt:输入控件操作

news/2025/2/22 10:55:01
1.单行输入框

QLineEdit ,单行输入,但是不能换行

属性特点
text输入框中的文本
inputMask输入内容格式约束,限制用户输入的格式。
maxLength最大长度,定义输入框允许的最大字符数。
frame是否添加边框,默认为 true 显示边框。
echoMode 显示方式:
QLineEdit::Normal:显示输入文本
QLineEdit::Password:隐藏输入字符
QLineEdit::NoEcho:不显示任何输入字符
cursorPosition光标所在位置,表示当前光标的索引。
alignment文字对齐方式,设置水平和垂直方向的对齐。 如:Qt::AlignLeftQt::AlignCenter 等
dragEnabled是否允许拖拽,默认为 false 不允许。
readOnly是否是只读的(不允许修改),默认为 false 可编辑。
placeHolderText当输入框内容为空时显示的提示信息。
clearButtonEnabled是否会自动显示出“清除按钮”,点击可清空文本,默认为 false 不显示
信号特点
cursorPositionChanged(int old, int new)当鼠标移动时发出此信号,old 为先前的位置,new 为新位置
editingFinished()当按返回或者回车键时,或者行编辑失去焦点时,发出此信号。
returnPressed()当返回或回车键按下时发出此信号。如果设置了验证器,则必须验证通过才能触发。
selectionChanged()当选中的文本改变时,发出此信号
textChanged(const QString &text)当 QLineEdit 中的文本改变时,发出此信号,text 是新的文本。代码对文本的修改也能触发这个信号。
textEdited(const QString &text)当 QLineEdit 中的文本被用户编辑改变时,发出此信号,text 是新的文本。代码对文本的修改不会触发这个信号

首先我们来完成一个界面,姓名,密码(隐藏),电话,性别的输入框,点击确定后进行打印

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setPlaceholderText("请输入姓名");
    ui->lineEdit_2->setPlaceholderText("请输入密码");
    ui->lineEdit_3->setPlaceholderText("请输入电话号码");
    ui->lineEdit->setClearButtonEnabled(true);
    ui->lineEdit_2->setClearButtonEnabled(true);
    ui->lineEdit_3->setClearButtonEnabled(true);//输入时显示清除按钮
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);//设置密码 隐藏
    ui->lineEdit_3->setInputMask("000-000-0000");//设置输入格式
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::get);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    qDebug()<<"客户姓名:"<<ui->lineEdit->text()<<"客户密码:"<<ui->lineEdit_2->text();
    int a=0;
    if(ui->radioButton->isChecked())
    {
        a=0;
    }
    else
    {
        a=1;
    }
    qDebug()<<"客户性别"<<(a==0?ui->radioButton->text():ui->radioButton_2->text());
    qDebug()<<"电话"<<ui->lineEdit_3->text();
}

 2.使用正则表达式进行验证

在电话输入时,为了格式的合法化,要11位数字,否则无法点击确认按钮(正则表达式问ai就行)

^\d{11}$

可以使用QRegExpValidator创建一个验证器进行操作,并且给lineEdit加textEdit信号的 slot 函数

on_lineEdit_textEdited 的参数是当前输入框的内容,通过 lineEdit->validator() 获取到内置的验证器
通过 validate 方法验证文本是否符合要求,第一个参数填写的是要验证的字符串 。由于参数要求是 QString& 而不是 const QString&,需要把这个变量复制一下。第二个参数是⼀个 int&,是输出型参数。当验证的字符串不匹配时,返回这个字符串的长度(没有什么实质作用)。返回值是⼀个枚举。 QValidator::Acceptable 表示 验证通过,QValidator::Invalid 表示验证不通过。

以下是验证代码

#include "widget.h"
#include "ui_widget.h"
#include<QRegularExpression>
#include<QRegularExpressionValidator>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{

    ui->setupUi(this);
    QRegularExpression reg("^\\d{11}$");
     QRegularExpressionValidator *validator = new QRegularExpressionValidator(reg, this);
     ui->lineEdit_3->setValidator(validator);
    ui->lineEdit->setPlaceholderText("请输入姓名");
    ui->lineEdit_2->setPlaceholderText("请输入密码");
    ui->lineEdit_3->setPlaceholderText("请输入电话号码");
    ui->lineEdit->setClearButtonEnabled(true);
    ui->lineEdit_2->setClearButtonEnabled(true);
    ui->lineEdit_3->setClearButtonEnabled(true);
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);
    ui->lineEdit_3->setInputMask("000-000-0000");
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::get);
     connect(ui->lineEdit_3, &QLineEdit::textChanged, this, &Widget::judge);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    qDebug()<<"客户姓名:"<<ui->lineEdit->text()<<"客户密码:"<<ui->lineEdit_2->text();
    int a=0;
    if(ui->radioButton->isChecked())
    {
        a=0;
    }
    else
    {
        a=1;
    }
    qDebug()<<"客户性别"<<(a==0?ui->radioButton->text():ui->radioButton_2->text());
    qDebug()<<"电话"<<ui->lineEdit_3->text();
}
void Widget::judge(const QString&text)
{
    QString context=text;
    int pos=0;
    if(ui->lineEdit_3->validator()->validate(context,pos)==QValidator::Acceptable)
    {
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}

创建验证器

 QRegularExpression reg("^\\d{11}$");
     QRegularExpressionValidator *validator = new QRegularExpressionValidator(reg, this);

连接

  connect(ui->lineEdit_3, &QLineEdit::textChanged, this, &Widget::judge);

验证函数

void Widget::judge(const QString&text)
{
    QString context=text;
    int pos=0;
    if(ui->lineEdit_3->validator()->validate(context,pos)==QValidator::Acceptable)
    {
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}

可以看到输入字母时按钮锁定

 3.两次输入密码是否一致

设置一个槽函数用于比较(两个按钮调用一个相同的槽函数)

#include "widget.h"
#include "ui_widget.h"
#include<QRegularExpression>
#include<QRegularExpressionValidator>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{

    ui->setupUi(this);
    QRegularExpression reg("^\\d{11}$");
     QRegularExpressionValidator *validator = new QRegularExpressionValidator(reg, this);
     ui->lineEdit_3->setValidator(validator);
    ui->lineEdit->setPlaceholderText("请输入姓名");
    ui->lineEdit_2->setPlaceholderText("请输入密码");
    ui->lineEdit_3->setPlaceholderText("请输入电话号码");
    ui->lineEdit_4->setPlaceholderText("请再次输入密码");
    ui->lineEdit->setClearButtonEnabled(true);
    ui->lineEdit_2->setClearButtonEnabled(true);
    ui->lineEdit_3->setClearButtonEnabled(true);
    ui->lineEdit_4->setClearButtonEnabled(true);
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);
    ui->lineEdit_4->setEchoMode(QLineEdit::Password);
    ui->lineEdit_3->setInputMask("000-000-0000");
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::get);
     connect(ui->lineEdit_3, &QLineEdit::textChanged, this, &Widget::judge);
    connect(ui->lineEdit_2, &QLineEdit::textChanged, this, &Widget::judge2);

    connect(ui->lineEdit_4, &QLineEdit::textChanged, this, &Widget::judge2);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    qDebug()<<"客户姓名:"<<ui->lineEdit->text()<<"客户密码:"<<ui->lineEdit_2->text();
    int a=0;
    if(ui->radioButton->isChecked())
    {
        a=0;
    }
    else
    {
        a=1;
    }
    qDebug()<<"客户性别"<<(a==0?ui->radioButton->text():ui->radioButton_2->text());
    qDebug()<<"电话"<<ui->lineEdit_3->text();
}
void Widget::judge(const QString&text)
{
    QString context=text;
    int pos=0;
    if(ui->lineEdit_3->validator()->validate(context,pos)==QValidator::Acceptable)
    {
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}
void Widget::judge1(const QString &arg1)
{
    this->compare();
}
void Widget::judge2(const QString &arg1)
{
    this->compare();
}
void Widget::compare()
{
    const QString &s1=ui->lineEdit_2->text();
    const QString &s2=ui->lineEdit_4->text();
    if(s1.isEmpty()&&s2.isEmpty())
    {
        ui->label_6->setText("密码为空");
    }
    else if(s1==s2)
    {
        ui->label_6->setText("密码一致");
    }
    else
    {
        ui->label_6->setText("密码不一致");
    }
}

4.切换显示密码

 可以使用checkbox,这个是一个有是否选中状态的按钮,来切换密码模式

#include "widget.h"
#include "ui_widget.h"
#include<QRegularExpression>
#include<QRegularExpressionValidator>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{

    ui->setupUi(this);
    QRegularExpression reg("^\\d{11}$");
     QRegularExpressionValidator *validator = new QRegularExpressionValidator(reg, this);
     ui->lineEdit_3->setValidator(validator);
    ui->lineEdit->setPlaceholderText("请输入姓名");
    ui->lineEdit_2->setPlaceholderText("请输入密码");
    ui->lineEdit_3->setPlaceholderText("请输入电话号码");
    ui->lineEdit_4->setPlaceholderText("请再次输入密码");
    ui->lineEdit->setClearButtonEnabled(true);
    ui->lineEdit_2->setClearButtonEnabled(true);
    ui->lineEdit_3->setClearButtonEnabled(true);
    ui->lineEdit_4->setClearButtonEnabled(true);
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);
    ui->lineEdit_4->setEchoMode(QLineEdit::Password);
    ui->lineEdit_3->setInputMask("000-000-0000");

    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::get);
     connect(ui->lineEdit_3, &QLineEdit::textChanged, this, &Widget::judge);
    connect(ui->lineEdit_2, &QLineEdit::textChanged, this, &Widget::judge2);
     connect(ui->checkBox, &QCheckBox::stateChanged, this, &Widget::change);


    connect(ui->lineEdit_4, &QLineEdit::textChanged, this, &Widget::judge2);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    qDebug()<<"客户姓名:"<<ui->lineEdit->text()<<"客户密码:"<<ui->lineEdit_2->text();
    int a=0;
    if(ui->radioButton->isChecked())
    {
        a=0;
    }
    else
    {
        a=1;
    }
    qDebug()<<"客户性别"<<(a==0?ui->radioButton->text():ui->radioButton_2->text());
    qDebug()<<"电话"<<ui->lineEdit_3->text();
}
void Widget::judge(const QString&text)
{
    QString context=text;
    int pos=0;
    if(ui->lineEdit_3->validator()->validate(context,pos)==QValidator::Acceptable)
    {
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton->setEnabled(false);
    }
}
void Widget::judge1(const QString &arg1)
{
    this->compare();
}
void Widget::judge2(const QString &arg1)
{
    this->compare();
}
void Widget::compare()
{
    const QString &s1=ui->lineEdit_2->text();
    const QString &s2=ui->lineEdit_4->text();
    if(s1.isEmpty()&&s2.isEmpty())
    {
        ui->label_6->setText("密码为空");
    }
    else if(s1==s2)
    {
        ui->label_6->setText("密码一致");
    }
    else
    {
        ui->label_6->setText("密码不一致");
    }
}

void Widget::change(bool checked)
{
    if(checked)
    {
         ui->lineEdit_2->setEchoMode(QLineEdit::Normal);
    }
    else
    {
         ui->lineEdit_2->setEchoMode(QLineEdit::Password);
    }
}

5.多行输入框

QTextEdit是一个富文本输入框,而且会在内容超过范围时提供滚动条

属性特点
markdown输入框内持有的内容,支持 Markdown 格式。能够自动对 Markdown 文本进行渲染成 HTML。
html输入框内持有的内容,可以支持大部分 HTML 标签,包括 img 和 table 等
placeHolderText输入框为空时提示的内容。
readOnly是否是只读的,默认为 false 可编辑。
undoRedoEnabled是否开启 undo/redo 功能,默认为 true 开启。
按下 Ctrl+Z 触发 undo
按下 Ctrl+Y 触发 redo
autoFormatting开启自动格式化功能。
tabStopWidth按下缩进占多少空间,默认单位为像素。
overwriteMode是否开启覆盖写模式,默认为 false 不开启。
acceptRichText是否接收富文本内容,默认为 true 接收
verticalScrollBarPolicy垂直方向滚动条的出现策略:
Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条(默认值)
Qt::ScrollBarAlwaysOff:总是关闭滚动条
Qt::ScrollBarAlwaysOn:总是显示滚动条
horizontalScrollBarPolicy水平方向滚动条的出现策略:
Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条(默认值)
信号特点
textChanged()文本内容改变时触发。
selectionChanged()选中范围改变时触发。
cursorPositionChanged()光标移动时触发。
undoAvailable(bool)当可以进行 undo 操作时触发,参数表示当前是否可以 undo。
redoAvailable(bool)当可以进行 redo 操作时触发,参数表示当前是否可以 redo。
copyAvailable(bool)文本被选中或取消选中时触发,参数表示当前是否有可复制的文本。

创建一个标签获取输入框的内容

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->textEdit,&QTextEdit::textChanged,this,&Widget::get);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    ui->label->setText(ui->textEdit->toPlainText());
}

6.下拉框

 QComboBox

属性特点
currentText当前选中的文本
currentIndex当前选中的条目下标,从0开始计算。如果没有条目被选中,值为-1
editable是否允许修改;设为true时,QComboBox的行为接近QLineEdit,并可设置validator
iconSize下拉框图标(小三角)的大小
maxCount最多允许有多少个条目

函数特点
addItem(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"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::get);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    qDebug()<<ui->comboBox->currentText()<<ui->comboBox_2->currentText();
}

7.文件下拉框

 以下为演示代码,注意路径不能有中文

#include "widget.h"
#include "ui_widget.h"
#include<fstream>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    std::ifstream file("D:/project/apple.txt");
    if(!file.is_open())
    {
        qDebug()<<1;
    }
    std::string line;
    while(std::getline(file,line))
    {
        ui->comboBox_3->addItem(QString::fromStdString(line));
    }
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::get);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::get()
{
    qDebug()<<ui->comboBox->currentText()<<ui->comboBox_2->currentText();
}

8.普通,日期,时间微调框

QSpanBox,就是可以通过按钮改变数字的大小

属性特点
value存储的数值
singleStep每次调整的"步长". 按下一次按钮数据变化多少
displayIntegerBase数字的进制。例如设为10,则是按照10进制表示;设为2则为2进制表示
minimum最小值
maximum最大值
suffix后缀
prefix前缀
wrapping是否允许换行
frame是否带边框
alignment文字对齐方式
readOnly是否允许修改
buttonSymbols按钮上的图标:上下箭头形式、加减号形式、没有按钮
accelerated按下按钮时是否为快速调整模式
correctionMode输入有误时如何修正:
- CorrectToPreviousValue: 恢复为上一个有效值
- CorrectToNearestValue: 恢复为最接近的有效值
keyboardTracking

是否开启键盘跟踪。
设为true, 每次在输入框输入一个数字, 都会触发一次valueChanged() 和 textChanged() 信号。
设为false, 只有在最终按下enter 或者输入框失去焦点, 才会触发 valueChanged() 和 textChanged() 信号

日期微调框QDateEdit,时间微调框QTimeEdit

属性特点
dateTime时间日期的值。格式形如:2000/1/1 0:00:00
date单纯日期的值。格式形如:2001/1/1
time单纯时间的值。格式形如:0:00:00
displayFormat时间日期显示格式。常用的格式化符号:
y: 年份
M: 月份
d: 日期
H: 小时(24小时制)
m: 分钟
s: 秒
注意,不同语言或库的设定规则可能存在差异,具体使用时应查阅文档
minimumDateTime设置可选择的最小时间日期
maximumDateTime设置可选择的最大时间日期
timeSpec指定时间的时区或偏移:
Qt::LocalTime: 显示本地时间
Qt::UTC: 显示协调世界时(UTC)
Qt::OffsetFromUTC: 显示相对于UTC的偏移量****(时差)****(UTC=LocalTime+8)
信号特点
dateChanged(QDate)当日期改变时触发。参数 QDate 包含新的日期值
timeChanged(QTime)当时间改变时触发。参数 QTime 包含新的时间值
dateTimeChanged(QDateTime)当日期或时间任意一个改变时触发。参数 QDateTime 包含新的日期时间值

演示代码

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::print);
}
void Widget::print()
{
    qDebug()<<ui->comboBox->currentText()<<ui->spinBox->text();
    qDebug()<<ui->comboBox_2->currentText()<<ui->spinBox_2->text();
    QDateTime old=ui->dateTimeEdit->dateTime();
    QDateTime new1=ui->dateTimeEdit_2->dateTime();
    int second=old.secsTo(new1);
    int hour=(second/3600)%24;
    int day=(second/3600)/24;
    qDebug()<<day<<hour;
}
Widget::~Widget()
{
    delete ui;
}

9.按钮 

QDial

属性特点
value持有的数值
minimum最小值
maximum最大值
singleStep按下方方向键的时候改变的步长
pageStep按下 PageUp/PageDown 的时候改变的步长
sliderPosition界面上旋钮显示的初始位置
racking外观是否会跟踪数值变化,默认值为 true,一般不需要修改
wrapping是否允许循环调整。即数值如果超过最大值,是否允许回到最小值(调整过程能否套圈)
otchesVisible是否显示刻度线
notchTarget刻度线之间的相对位置。数字越大,刻度线越稀疏
信号特点
valueChanged(int)数值改变时触发
rangeChanged(int, int)范围变化时触发。参数包含新的最小值和最大值

设置按钮控制不透明度

qt designer里面设置刻度可见,初始值100,从20到80,可以循环旋转(注意有参数的槽函数应该怎么连接

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public slots:
            void get(int val);
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
     connect(ui->dial, SIGNAL(valueChanged(int)), this, SLOT(get(int)));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::get(int val)
{
    ui->label->setText("当前不透明度为"+QString::number(val));
    this->setWindowOpacity((double)val/100);
}
10.滑动条

QSlider,它和QDial共同继承于QAbstractSlider,所以属性和信号基本一致

使用滑动条调整窗口大小与自定义按键控制hua'don't

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->horizontalSlider, &QSlider::valueChanged, this, &Widget::getline);

    connect(ui->verticalSlider, &QSlider::valueChanged, this, &Widget::get);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::getline(int val)
{
    const QRect&rect=this->geometry();
    this->setGeometry(rect.x(),rect.y(),val,rect.height());
}
void Widget::get(int val)
{
    const QRect&rect=this->geometry();
    this->setGeometry(rect.x(),rect.y(),rect.width(),val);
}

 也可以设置快捷键w和s来同步控制滑动条

#include "widget.h"
#include "ui_widget.h"
#include<QShortcut>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QShortcut*sc1=new QShortcut(this);
      QShortcut*sc2=new QShortcut(this);
    sc1->setKey(QKeySequence("w"));
      sc2->setKey(QKeySequence("s"));
    connect(sc1,&QShortcut::activated,this,&Widget::add);
      connect(sc2,&QShortcut::activated,this,&Widget::sub);
   // connect(ui->horizontalSlider, &QSlider::valueChanged, this, &Widget::getline);
connect(ui->verticalSlider, &QSlider::valueChanged, this, &Widget::set);

   // connect(ui->verticalSlider, &QSlider::valueChanged, this, &Widget::get);
  ui->verticalSlider->setValue(this->height());
}

Widget::~Widget()
{
    delete ui;
}
void Widget::getline(int val)
{
    const QRect&rect=this->geometry();
    this->setGeometry(rect.x(),rect.y(),val,rect.height());
}
void Widget::get(int val)
{
    const QRect&rect=this->geometry();
    this->setGeometry(rect.x(),rect.y(),rect.width(),val);
}
void Widget::sub()
{
    const QRect& rect = this->geometry();
    int newHeight = rect.height() - 10;
    if (newHeight < 10) {
        newHeight = 10;
    }
    this->setGeometry(rect.x(), rect.y(), rect.width(), newHeight);
       ui->verticalSlider->setValue(newHeight);
}

void Widget::add()
{
    const QRect& rect = this->geometry();
    int newHeight = rect.height() + 10;
    this->setGeometry(rect.x(), rect.y(), rect.width(), newHeight);
     ui->verticalSlider->setValue(newHeight);
}
void Widget::set(int height)
{
    const QRect& rect = this->geometry();
    this->setGeometry(rect.x(), rect.y(), rect.width(), height);

}


http://www.niftyadmin.cn/n/5862139.html

相关文章

【GitHub】github学生认证,在vscode中使用copilot的教程

github学生认证并使用copilot教程 写在最前面一.注册github账号1.1、注册1.2、完善你的profile 二、Github 学生认证注意事项&#xff1a;不完善的说明 三、Copilot四、在 Visual Studio Code 中安装 GitHub Copilot 扩展4.1 安装 Copilot 插件4.2 配置 Copilot 插件&#xff0…

什么是超越编程(逾编程)(元编程?)

超越编程(逾编程)(元编程&#xff1f;)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素&#xff0c;其有三种含义&#xff…

3D打印注塑件-省模具费90%的解决方案

"开模费用50万&#xff0c;首批订单才200件&#xff1f;" 这是许多制造企业的真实困境。传统注塑工艺动辄数周的开模周期和5-50万元的模具成本&#xff0c;让中小企业的产品迭代举步维艰。 在传统制造流程中&#xff0c;注塑件的生产往往需要高昂的模具开发费用和较…

嵌入式之总线

嵌入式系统中的总线(Bus)是指用于连接各种组件(如处理器、存储器、外设等)的通信通道。总线的设计和实现对嵌入式系统的性能、功耗和扩展性有着重要影响。下面详细介绍嵌入式系统中的总线的概念、类型和特点。 一、总线的基本概念 总线是一种共享的通信路径,允许多个设备…

数据结构PTT优化部门树查询

数据结构PTT优化部门树查询 进入正文之前先给出一个概念,可以在看完文章后再来看这个数据结构概念 预排序遍历树&#xff08;Modified Preorder Tree Traversal&#xff0c;简称MPTT&#xff09;是一种通过冗余字段优化树形结构查询效率的算法&#xff0c;常用于解决多层级分类…

Elasticsearch 中如何限制和指定 IP 地址的访问?

在现代的微服务架构中&#xff0c;保护系统不受未授权访问是非常重要的&#xff0c;尤其是在网关层。极限网关&#xff08;INFINI Gateway&#xff09;作为我们服务架构的入口&#xff0c;它的安全性直接影响到整个系统的稳定与安全。 极限网关提供了强大的 IP 访问控制 功能&a…

web安全:跨站请求伪造 (CSRF)

跨站请求伪造 (CSRF) ​ 跨站请求伪造&#xff08;CSRF&#xff0c;Cross-Site Request Forgery&#xff09; 是一种网络攻击方式&#xff0c;攻击者诱使受害者在未经其授权的情况下执行特定操作。CSRF 利用受害者已登录的身份和浏览器自动发送的认证信息&#xff08;如 Cooki…

如何查找 UBuntu的 arm版本

Ubuntu官网 https://ubuntu.com/ 如图&#xff1a; 点击 Tab栏的Download Ubuntu >> Server >> ARM >> 点击Download 24.04.2 LTS 即可 如果需要其他版本 点击 Alternative and previous releases 进入到如下页面选择想要的版本下载即可