Qt第三课 ----------输入类的控件属性

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


输入类

  • **作者前言**
  • LineEdit
    • QValidator
  • QTextEdit
    • html 和markdown
    • undoRedoEnable
    • tabstopWidth
    • overwritemode
    • acceptRichText
    • verticalScrollBarPolicy和horizontalScrollBarPolicy
    • 信号函数textChanged()
    • 信号函数selectionChanged()
    • 信号函数cursorPositionChanged
  • QCombo box
  • Spin Box和 QDoubleSpinBox
  • 5 Date Edit & Time Edit
  • Dial
  • QSlider

LineEdit

QLineEdit ⽤来表⽰单⾏输⼊框. 可以输⼊⼀段⽂本, 但是不能换⾏.
相关属性如下:
在这里插入图片描述

在这里插入图片描述
还有一些信号函数
在这里插入图片描述
下面使用一些代码简单的介绍

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);const QRect pointOne = Lineedtifuntion("账号:", "请输入账号",this->geometry().width()/2, this->geometry().height()/2);const QRect pointTwo =Lineedtifuntion("密码:", "请输入密码", pointOne.x(), pointOne.y());const QRect pointThree = Buttonfuntion("性别:","", pointTwo.x(), pointTwo.y());const QRect pointfour = Lineedtifuntion("电话:", "请输入电话号码", pointThree.x(), pointThree.y());//登入按钮QPushButton* button = new QPushButton("登入", this);button->move(QPoint(pointfour.x() , pointfour.y()+50));}const QRect Widget::Lineedtifuntion(QString name, QString inpt, int x, int y)
{QLabel* label = new QLabel(name,this);label->move(x,y+50);QLineEdit* lineeditOne = new QLineEdit(this);lineeditOne->move(QPoint(label->geometry().x()+50 , label->geometry().y()));lineeditOne->setMaxLength(15);lineeditOne->setFrame(true);lineeditOne->setPlaceholderText(inpt);//判断是否为密码if("密码:"==name)//更换显示模式lineeditOne->setEchoMode(QLineEdit::Password);lineeditOne->setClearButtonEnabled(true);//显示出自动清理按钮//进行电话号码的格式约束if("电话:"== name)lineeditOne->setInputMask("000-000-000");return label->geometry();}const QRect Widget::Buttonfuntion(QString name, QString inpt, int x, int y)
{QLabel* label = new QLabel(name,this);label->move(x,y+50);//性别QRadioButton* rediobuttonmale = new QRadioButton("男",this);rediobuttonmale->move(QPoint(label->geometry().x()+50 , label->geometry().y()));QRadioButton* rediobuttonfemale= new QRadioButton("女",this);rediobuttonfemale->move(QPoint(rediobuttonmale->geometry().x()+50 , rediobuttonmale->geometry().y()));return label->geometry();}

效果如下:
在这里插入图片描述
这里的演示了setMaxLength(设置最大长度)、setFrame(设置边框),setPlaceholderText(为空时显示的内容),>setEchoMode(显示格式),

其中setClearButtonEnabled(设置清除)的效果如下:
在这里插入图片描述
剩下的就不过多介绍了。

QValidator

还需要注意的是inputMask。这个是一个简单格式约束,上面的代码000-000-000表示只能输入数字,光靠这个还是不行的,这就要使用到正则表达式了
这个正则表达式可以去网上查查
下面我们使用正则表达式来进行验证一下。
首先我们需要进行创建一个QRegExp对象,然后使用验证器进行验证,在Qt中有四种验证器

如图:
在这里插入图片描述
**注意:**QRegularExpressionValidator 在匹配性能上做出了⼀定优化. 但是从使⽤⻆度讲, 和
QRegExpValidator 差别不⼤. 我们使⽤ QRegExpValidator 即可
大致思路就是。 创建一个验证器, 然后验证字符串和正则表达式是否符合
下面就是使用到的QRegExpValidator::validate函数,

在这里插入图片描述
第⼀个参数填写的是要验证的字符串. 由于参数要求是 QString& ⽽不是 const
QString& , 需要把这个变量复制⼀下.
◦ 第⼆个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的⻓度. (没有
啥实质作⽤)
在这里插入图片描述
这个函数的返回值是一个枚举类型,
如图:
在这里插入图片描述
代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//QLineEdit * number = new QLineEdit(this);number->setGeometry(50,50,300,100);//创建验证按钮QPushButton *buttonvalidator =new  QPushButton("验证",this);//创建正则表达式对象QRegExp regexp("^1\\d{10}\\d$");//创建验证器QRegExpValidator * validator= new QRegExpValidator(regexp,this);//    connect(buttonvalidator, &QPushButton::clicked, this, [=]()
//    {
//        number->setValidator(validator);//设置一个内置的验证器,需要返回一个validator对象
//        QString str = number->text();
//        int num = 0;
//        QValidator::State elemest =  number->validator()->validate(str,num);
//        if(elemest == QValidator::Acceptable)
//            qDebug() << "验证通过";
//        else
//            qDebug()<< "验证不通过"<< num << str << elemest;//    });connect(number, &QLineEdit::textEdited, this, [=](const QString &str){QString ch =  str;int point = 0;number->setValidator(validator);if(number->validator()->validate(ch, point) == QValidator::Acceptable)qDebug() << "验证通过";elseqDebug()<< "验证不通过" << str;});}

效果如下:
在这里插入图片描述
这里的代码主要演示的是判断字符是否符合要求,
下来我们还可以写一段注册页面的设置密码的情况, 就写一个输入的两个密码是否一致

// 输入两串字符是否一致//创建两个lineeditQLineEdit* passwordOne = new QLineEdit(this);QLineEdit* passwordTwo = new QLineEdit(this);passwordOne->setEchoMode(QLineEdit::Password);passwordTwo->setEchoMode(QLineEdit::Password);QRect pos = passwordOne->geometry();passwordTwo->move(pos.x(), pos.y()+50);connect(passwordOne, &QLineEdit::textEdited, this, [=](const QString &arg){(void)arg;//获取这个文本QString textOne = passwordOne->text();//设置验证器QRegExp elemest(textOne);QRegExpValidator* validator = new QRegExpValidator(elemest, this);//给第二行设置内置验证器passwordTwo->setValidator(validator);});connect(passwordTwo, &QLineEdit::textEdited, this,[=](const QString & arg){(void)arg;QString textTwo = passwordTwo->text();int strsize = 0;QValidator::State ret =  passwordTwo->validator()->validate(textTwo, strsize);if(ret == QValidator::Acceptable)qDebug()<< "验证成功";elseqDebug()<< "验证失败";});//创建一个显示密码按钮QCheckBox* Onebutton = new QCheckBox("显示密码",this);//密码框QLineEdit * passwrodLine = new QLineEdit(this);passwrodLine->setEchoMode(QLineEdit::Password);passwrodLine->setGeometry(Onebutton->geometry().x(), Onebutton->geometry().y()+100, 200,100);connect(Onebutton, &QCheckBox::clicked, this, [=](bool checkedelement){if(checkedelement != false)passwrodLine->setEchoMode(QLineEdit::Normal);elsepasswrodLine->setEchoMode(QLineEdit::Password);});

这里的代码是第二行输入框输入的字符数量会受到第一行输入框输入的字符限制的,不会跟我们见到的两行输入框可以随便输入,如果要实现这样的效果, 代码如下:

 connect(passwordOne, &QLineEdit::textEdited, this, [=](const QString &arg){(void)arg;//获取这个文本QString textOne = passwordOne->text();QString textTwo = passwordTwo->text();if(textOne == textTwo)qDebug()<< "验证成功";elseqDebug()<< "验证失败";});connect(passwordTwo, &QLineEdit::textEdited, this,[=](const QString & arg){(void)arg;//获取这个文本QString textOne = passwordOne->text();QString textTwo = passwordTwo->text();if(textOne == textTwo)qDebug()<< "验证成功";elseqDebug()<< "验证失败";});

我们还可以写一个显示密码的代码出来来进一步的演示

 QCheckBox* Onebutton = new QCheckBox("显示密码",this);//密码框QLineEdit * passwrodLine = new QLineEdit(this);passwrodLine->setEchoMode(QLineEdit::Password);passwrodLine->setGeometry(Onebutton->geometry().x(), Onebutton->geometry().y()+100, 200,100);connect(Onebutton, &QCheckBox::clicked, this, [=](bool checkedelement){if(checkedelement != false)passwrodLine->setEchoMode(QLineEdit::Normal);elsepasswrodLine->setEchoMode(QLineEdit::Password);});

QTextEdit

表⽰多⾏输⼊框. 也是⼀个富⽂本 & markdown 编辑器,支持html、markdown和纯文本
如果只是想使用纯文本格式可以使用QPlainText,这两个类是差不多的
属性如下:
markdown :输⼊框内持有的内容. ⽀持 markdown 格式. 能够⾃动的对markdown ⽂本进⾏渲染成 html

html: 输⼊框内持有的内容. 可以⽀持⼤部分 html 标签. 包括 img 和 table 等.
placeHolderText: 输⼊框为空时提⽰的内容
readOnly:是否是只读的
undoRedoEnable:是否开启 undo / redo 功能.,按下 ctrl + z 触发 undo,按下 ctrl + y 触发 redo
在这里插入图片描述
信号函数
在这里插入图片描述

下面我们一一使用代码演示

html 和markdown

这两个属性主要是让文本按照html或者maekdown格式来渲染

QTextEdit* Multiple_Line = new QTextEdit(this);Multiple_Line->setHtml("<p>你好呀</p>");

效果如下:
在这里插入图片描述
这里只是演示了html的写法,markdown的写法可以自行探索
需要注意的是,如果我们想要获取到对于的文本,不能直接使用html或者markdown,例如获取html的文本:

 qDebug()<< Multiple_Line->toHtml();

效果如下
在这里插入图片描述
如果想要获取纯文本,可以使用toPlainText()

undoRedoEnable

这个就是可以设置是否可以剪切(undo)和剪切撤回(redo)

Multiple_Line->setUndoRedoEnabled(false);

禁用

tabstopWidth

这个属性就是按下tap键缩进多少个字符,

 Multiple_Line->setTabStopWidth(6);//缩进6个字符

overwritemode

开启覆盖写模式
这个主要是覆盖输入目前的内容,某些编程环境或框架中,这个方法通常用于设置一个对象或组件在处理数据时是否允许覆盖现有的数据。
这里的话实现不了

acceptRichText

这个是用来设置是否可以富文本的
富文本:组件允许用户输入包含格式(如字体、颜色、粗体、斜体等)的文本。这意味着用户可以使用富文本编辑器的功能来格式化他们的文本。

verticalScrollBarPolicy和horizontalScrollBarPolicy

verticalScrollBarPolicy是设置垂直滚动条, horizontalScrollBarPolicy是设置水平滚动条

有三个分别是:
Qt::ScrollBarAsNeeded : 根据内容⾃动决定是否需要滚动条。这是默认值。
• Qt::ScrollBarAlwaysOff : 总是关闭滚动条。
• Qt::ScrollBarAlwaysOn : 总是显⽰滚动条。

Multiple_Line->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);Multiple_Line->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

如图:
在这里插入图片描述

信号函数textChanged()

当文本内容被改变就会触发

connect(Multiple_Line, &QTextEdit::textChanged, this, [=](){qDebug()<< Multiple_Line->toPlainText();//获取纯文本});

效果如下:
在这里插入图片描述

信号函数selectionChanged()

当光标选中的内容触发
下面我们需要使用到一个类
QTextEdit 中包含了⼀个 QTextCursor 对象, 通过这个对象可以获取到当前光标位置和选中
的内容.
textCursor()返回一个 QTextCursor 对象,使用selectedText()可以查看光标选中的内容

 connect(Multiple_Line, &QTextEdit::selectionChanged,this,[=](){qDebug()<< "选择的内容:" << Multiple_Line->textCursor().selectedText();});

效果如下:
在这里插入图片描述
当我们鼠标左键按住不放,就会不断的认为光标的选择范围不断发生改变,当我们松开,就不会输出

信号函数cursorPositionChanged

光标移动时触发

 connect(Multiple_Line, &QTextEdit::cursorPositionChanged,this,[=](){qDebug()<< "选择的内容:" << Multiple_Line->textCursor().selectedText();});

如图:
在这里插入图片描述
光标移动就会触发

剩下的信号函数,可以根据自己去实现一下,

QCombo box

这个一个下拉框的类
属性和方法如下:
在这里插入图片描述
在这里插入图片描述

核心信号如下:
在这里插入图片描述
下面我们一一演示代码

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//写一个下拉框,用户可以自己添加QComboBox* comboboxOne = new QComboBox(this);//QLineEdit * valueEdit = new QLineEdit(this);QPushButton *addButton = new QPushButton("添加", this);valueEdit->move(this->geometry().x()+100, this->geometry().y());addButton->move(valueEdit->geometry().x()+500, valueEdit->geometry().y());valueEdit->setPlaceholderText("输入要添加的内容");comboboxOne->setMaxCount(15);//设置用户可以修改comboboxOne->setEditable(true);connect(addButton, &QPushButton::clicked, this,[=](){comboboxOne->addItem(valueEdit->text());valueEdit->setText("");if(comboboxOne->currentIndex()+1 >= 15)qDebug() << "添加失败,已经饱和";elseqDebug()<< "你当前选择的序列号为:" << comboboxOne->currentIndex()+1<< "内容为:"<< comboboxOne->currentText();});comboboxOne->addItem("hello");}

效果如下:
在这里插入图片描述
这里的代码使用到了curretext 、currentIndex、Editable等方法, 可以很直观的看到效果

下面我们写一些关于信号函数的代码出来看看效果
下面我们需要读取文件, 在C语言中可以使用fopen来打开文件,在C++中可以使用fstream来打开文件
下面是以cpu为中心, 来进行判断使用ifstream还是ofstream的
在这里插入图片描述
代码如下:

 QComboBox* comboboxOne = new QComboBox(this);//打开文件std::ifstream file("../ComboBox/one.txt");//判断文件是否打开成功if(!file.is_open())qDebug()<< "打开失败";else{qDebug()<< "打开成功";//开始读取std::string linech;while(std::getline(file, linech))//如果读取成功,流的状态将保持良好;如果到达文件末尾或发生错误,流的状态将变为不良{comboboxOne->addItem(QString::fromStdString(linech));}file.close();}

效果如下:
在这里插入图片描述
QString::fromStdString(linech)中这个函数是把string类型转换成Qstring, 如果想要把Qstring
转换成string, 可以使用toStdString()

Spin Box和 QDoubleSpinBox

这两种属于一种微调框,它是带有按钮的输⼊框. 可以⽤来输⼊整数/浮点数. 通过点击按钮来修改数值⼤⼩.
如图:
在这里插入图片描述
由于这两个是相似的下面就以讲解spinbox为主

属性如下:

QSpinBox 的关键属性包括:

value: 获取或设置当前的整数值。

minimum: 设置允许的最小值。

maximum: 设置允许的最大值。

singleStep: 设置每次增减的步长。

prefix: 设置显示在值前的字符串。

suffix: 设置显示在值后的字符串。

wrap: 设置是否允许循环输入(即超过最大值后回到最小值)。

readOnly: 设置为只读模式,防止用户直接输入。

displayIntegerBase: 设置显示的进制(如十进制或十六进制)。
在这里插入图片描述
在这里插入图片描述
信号函数如下:
在这里插入图片描述

图形化界面如下:
在这里插入图片描述

代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->label->setText("主食");ui->label_2->setText("饮料");ui->label_3->setText("菜品");fileRead("../spinbox/staplefood.txt", ui->comboBox);fileRead("../spinbox/drinck.txt", ui->comboBox_2);fileRead("../spinbox/dish.txt", ui->comboBox_3);ui->spinBox->setRange(1,5);//范围ui->spinBox_2->setRange(1,5);ui->spinBox_3->setRange(1,5);PreFixx(ui->spinBox, "数量:");SufFixx(ui->spinBox, "个");ui->spinBox->setFixedSize(100,20);}Widget::~Widget()
{delete ui;
}void Widget::fileRead(QString fileName, QComboBox*  propre)
{if(fileName.isEmpty())return;//打开文件std::ifstream file(fileName.toStdString());//判断是否打开成功if(!file.is_open()){qDebug()<< "失败";return;}std::string line;//读取while(std::getline(file,line)){propre->addItem(QString::fromStdString(line));}file.close();}void Widget::PreFixx(QSpinBox *element, const QString fix)
{element->setPrefix(fix);
}void Widget::SufFixx(QSpinBox *element, const QString fix)
{element->setSuffix(fix);
}

这里采用两者结合,更加清晰的观察,效果如下:
在这里插入图片描述
代码还有一些未使用的函数,可以自行探讨,

信号函数的使用

connect(ui->spinBox, &QSpinBox::textChanged,this, [=](const QString &ch){qDebug()<< ch;});void Widget::on_spinBox_valueChanged(int arg1)//通过函数名链接
{qDebug()<< arg1;
}

效果如下:
在这里插入图片描述

5 Date Edit & Time Edit

这个是根据SpinBox来进行改造过来的,
注意:使⽤ QDateEdit 作为⽇期的微调框 以及 使⽤ QTimeEdit 作为时间的微调框
属性如下:
date: 获取或设置当前日期。
minimumDate: 获取或设置允许选择的最早日期。
maximumDate: 获取或设置允许选择的最晚日期。
displayFormat: 设置日期在控件中显示的格式,例如 “yyyy-MM-dd”。
calendarPopup: 指示是否在点击控件时显示日历弹出窗口。
timeSpec: 获取或设置时间的规格(如本地时间或 UTC)。
(Qt::LocalTime :显⽰本地时间。
• Qt::UTC :显⽰协调世界时(UTC)。
• Qt::OffsetFromUTC :显⽰相对于UTC的偏移量(时差))

readOnly: 设置控件是否为只读模式。
信号函数如下:
在这里插入图片描述
下面开始演示
代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建时间框QDateEdit * DateTime = new QDateEdit(this);DateTime->setDisplayFormat("yyyy年MM月dd日");DateTime->setTimeSpec(Qt::LocalTime);
}

效果如下:
在这里插入图片描述
需要注意的是,我们选中日期的年份可以进行修改,也可以选择月份进行修改

Dial

表⽰⼀个 旋钮
如同:
在这里插入图片描述

属性如下:
minimum: 获取或设置旋钮的最小值。
maximum: 获取或设置旋钮的最大值。
value: 获取或设置当前旋钮的值。
singleStep: 设置每次调整旋钮时的增量(通常用于按键调整)。
pageStep: 设置每次大步调整旋钮时的增量(通常用于鼠标滚轮)。
notchTarget: 设置旋钮的刻度间隔,决定刻度的分布。
notchesVisible 是否显⽰ 刻度线
wrapping: 设置是否允许旋钮值在达到最大值后回到最小值(布尔值)。
sliderPosition: 获取或设置滑块当前的位置。

信号函数如下:
在这里插入图片描述
下面我们写一个通过旋转按钮来设置窗口的透明度,

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->dial->setWrapping(true);// 允许循环ui->dial->setSingleStep(1);// 步长ui->dial->setNotchesVisible(true);//显示刻度ui->dial->setNotchTarget(10);//刻度与刻度之前的格数ui->dial ->setMinimum(0);ui->dial->setMaximum(100);this->setWindowIcon(QIcon(QPixmap(":/img1.png")));//添加背景图片QPalette paletee;paletee.setBrush(QPalette::Background, QBrush(QPixmap(":/img1.png")));this->setPalette(paletee);this->setAutoFillBackground(true);
}Widget::~Widget()
{delete ui;
}
void Widget::on_dial_valueChanged(int value)
{qDebug()<< value;//窗口透明度this->setWindowOpacity(value/100.0);
}

效果如下:
在这里插入图片描述

QSlider

表⽰⼀个滑动条.
这个和QDila是一样的,QSlider 和 QDial 都是继承⾃ QAbstractSlider , 因此⽤法上基本相同
下面列举出不同的属性
orientation 滑动条的⽅向是⽔平还是垂直
invertedAppearance 是否要翻转滑动条的⽅向
tickPosition 刻度的位置.
tickInterval 刻度的密集程度

下面我们写一段代码控制widget窗口的大小:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QRect coordinate = this->geometry();//创建水平滑动条QSlider* horizontalSlider = SliderCtreat(Qt::Horizontal);//创建垂直滑动条QSlider* verticalSlider = SliderCtreat(Qt::Vertical,true);horizontalSlider->setMaximum(coordinate.width());verticalSlider->setMaximum(coordinate.height());horizontalSlider->setSliderPosition(horizontalSlider->maximum());verticalSlider->setSliderPosition(horizontalSlider->maximum());verticalSlider->move(verticalSlider->x(), verticalSlider->y()+50);connect(horizontalSlider, &QSlider::valueChanged, this, [=](int value){qDebug() <<"horizontal:"<< value;QRect coordinate = this->geometry();this->setGeometry(coordinate.x(), coordinate.y(), value, coordinate.height());});connect(verticalSlider, &QSlider::valueChanged, this, [=](int value){qDebug() <<"vertical:"<< value;QRect coordinate = this->geometry();this->setGeometry(coordinate.x(), coordinate.y(),  coordinate.height(),(value));});}
QSlider *Widget::SliderCtreat(Qt::Orientation a, bool change)
{QSlider * slider = new QSlider(this);slider->setOrientation(a);//设置滑动条水平或者垂直slider->setInvertedAppearance(change);//设置滑动条的滑动方向是否发生改变.slider->setSliderPosition(100);return slider;}

如图:
在这里插入图片描述

我们还可以通过设置快捷键来进行控制滑动条的滑动
代码如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建两个快捷键QShortcut* subShorcurLeft = new QShortcut(this);QShortcut* addShorcurrigth = new QShortcut(this);subShorcurLeft->setKey(QKeySequence("-"));addShorcurrigth->setKey(QKeySequence("+"));ui->horizontalSlider->setSingleStep(1);ui->horizontalSlider->setMaximum(200);connect(subShorcurLeft, &QShortcut::activated, this, [=](){ui->horizontalSlider->setSliderPosition(ui->horizontalSlider->value()-1);ui->label->setText(QString::number(ui->horizontalSlider->value()));});connect(addShorcurrigth, &QShortcut::activated, this, [=](){ui->horizontalSlider->setSliderPosition(ui->horizontalSlider->value()+1);ui->label->setText(QString::number(ui->horizontalSlider->value()));});
}

效果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java面试2.0

一.Zookeeper 1.定义 ZooKeeper 是一个开源的分布式协调服务&#xff0c;它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&#xff0c;并以一系列简单易用的接口提供给用户使用。 ZooKeeper 为我们提供了高可用、高性能…

【论文复现】语言模型中的多模态链式推理

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】 &#x1f310; 在现代前端开发中&#xff0c;单页面应用&#xff08;SPA&#xff09;以及不同的架构模式&#xff08;如MVC和MVVM&#xff09;是实现用户交互的关键概念。了解它们的优缺点以及如何应用&a…

前端八股文第五篇

41. 做的比较好的项目&#xff0c;展开讲讲 我曾参与开发过一个电商平台的项目&#xff0c;该项目是一个多端适配的电商平台&#xff0c;包括网页端、移动端和小程序端。在这个项目中&#xff0c;我主要负责前端开发工作。我们团队采用了 Vue.js 框架进行开发&#xff0c;使用…

运筹说 第127期 | 存储论相关模型代码实现

本期我们进行运筹学之存储论算法的讲解&#xff0c;我们将对常见的商品存储模型进行介绍&#xff0c;并求解不同供需条件下的最优存储策略&#xff0c;通过MATLAB和Python工具帮助大家快速求解最优存储策略&#xff0c;做到事半功倍。由于篇幅有限&#xff0c;小编接下来只展示…

【Linux】Linux权限

本文将会围绕着下面5个问题进行讲解&#xff1a; 认识Linux下用户的分类什么叫做权限没有权限会有什么现象如何进行权限的修改其他与权限相关的问题 好了&#xff0c;本章内容就要开始了&#xff0c;准备你的大脑&#xff0c;开凿吧&#xff01;&#xff01;&#xff01; 认识…

Ubuntu系统如何实现键盘按键映射到其他按键(以 Ctrl+c 映射到 F3,Ctrl+v 映射到 F4 为例)

文章目录 写在前面1. 功能描述2. 实现步骤2.1 安装AutoKey2.2 软件设置2.2.1 软件设置 2.3 测试是否安装成功 参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 1. 功能描述 Ubuntu系统使用Ctrlc 、Ctrlv 进行复制粘贴操作的时候&#xff0c;时间长了就会出现小拇指…

threejs开源实例-粒子地球

源码 three.js webgl - geometry - cube <script type"module">import * as THREE from "three";import { OrbitControls } from "three/addons/controls/OrbitControls.js";import { GUI } from "three/addons/libs/lil-gui.modul…

苍穹外卖的vue开发

前端的环境搭建 技术选型 熟悉目录结构 如何梳理代码 以登录功能进行示例 先看前端页面 这个路径一定是对应了一个对应的路由,这个路由一定对应了某个组件 找到登录的方法 这个方法在store中,是异步方法 store中有一个actions方法 对应的是login的api请求 request是我们单独…

docker desktop使用ubuntu18.04带图形化+运行qemu

记录一下docker desktop使用ubuntu18.04带图形化命令和使用步骤 1. 下载镜像 参考&#xff1a;【Docker教程】Docker部署Ubuntu18.04(带图形化界面) 命令&#xff1a; docker pull kasmweb/ubuntu-bionic-desktop:1.10.02. 启动镜像 命令&#xff1a; docker run -d -it …

springboot入门学习笔记2(连接mysql,使用mybatis,plus等)

对于application.yml的学习 application.yml 是 Spring Boot 的核心配置文件&#xff0c;用于定义应用程序的配置属性。 它允许开发者通过 YAML 格式配置各种属性&#xff0c;如服务器端口、数据库连接、第三方服务端点等。 这些属性通过 Spring 的 ConfigurationProperties…

5G基础知识

那个工种&#xff1f; FDD 频分双工&#xff08;Frequency Division Duplexing&#xff09;&#xff0c;理解起来很简单&#xff0c;就是把上行和下行业务隔离在两个频段&#xff0c;互不干扰。 而 TDD 时分双工&#xff08;Time-Division Duplexing&#xff09;&#xff0c;是…

大数据治理:策略、技术与挑战

随着信息技术的飞速发展&#xff0c;大数据已经成为现代企业运营和决策的重要基础。然而&#xff0c;大数据的复杂性、多样性和规模性给数据管理带来了前所未有的挑战。因此&#xff0c;大数据治理应运而生&#xff0c;成为确保数据质量、合规性、安全性和可用性的关键手段。本…

022集——统计多条线的总长度(CAD—C#二次开发入门)

如下图所示&#xff0c;选择多条线并统计长度&#xff1a; c#中不包含直接获取curve曲线长度 属性&#xff0c;需用如下方法&#xff1a;curve.GetDistanceAtParameter(item.EndParam) 附部分代码如下&#xff1a; using Autodesk.AutoCAD.ApplicationServices; using Autode…

WPF+MVVM案例实战(十四)- 封装一个自定义消息弹窗控件(下)

文章目录 1、案例效果2、弹窗控件使用1.引入用户控件2、按钮命令实现 3、总结4、源代码获取 1、案例效果 2、弹窗控件使用 1.引入用户控件 打开 Wpf_Examples 项目&#xff0c;在引用中添加用户控件库&#xff0c;在 MainWindow.xaml 界面引用控件库&#xff0c;代码如下&…

2024年计算机视觉与图像处理国际学术会议 (CVIP 2024)

目录 大会简介 主办单位&#xff0c;协办单位 组委会 主讲嘉宾 征稿主题 参会方式 会议议程 重要信息 会议官网&#xff1a;iccvip.org 大会时间&#xff1a;2024年11月15日-17日 大会地点&#xff1a;中国 杭州 大会简介 2024年计算机视觉与图像处理国际学术会议(C…

硅谷甄选(8)spu

Spu模块 SPU(Standard Product Unit)&#xff1a;标准化产品单元。是商品信息聚合的最小单位&#xff0c;是一组可复用、易检索的标准化信息的集合&#xff0c;该集合描述了一个产品的特性。通俗点讲&#xff0c;属性值、特性相同的商品就可以称为一个SPU。 7.1 Spu模块的静态…

【element el-date-picker限制时间选择范围】

问题场景 在一次项目中,有一个这样的需求就是填报时间需要在上一次提交信息之后,在限制时间时发现,el-date-picker中的pickerOption中的disableDate是基于日期限制的,若限制日期为今日凌晨,那么今天之后的日期都不能填 <el-date-pickerv-model="selectedDateTime&…

我也谈AI

“随着人工智能技术的不断发展&#xff0c;我们已经看到了它在各行业带来的巨大变革。在医疗行业中&#xff0c;人工智能技术正在被应用于病例诊断、药物研发等方面&#xff0c;为医学研究和临床治疗提供了新的思路和方法&#xff1b;在企业中&#xff0c;人工智能技术可以通过…

机器人对人工智能未来发展的影响

机器人作为人工智能&#xff08;AI&#xff09;技术的一个重要应用领域&#xff0c;对人工智能的未来发展具有深远的影响。机器人和人工智能在技术上存在深度的交叉和融合。人工智能为机器人提供了强大的感知、决策和执行能力&#xff0c;而机器人则成为人工智能技术的最佳载体…