[Qt的学习日常]--常用控件3

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

  如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正

目录

 一、显示类控件

1、Label

2、LCD Number

 3、ProgressBar

 4、Calendar Widget

二、输出类控件 

1、QLineEdit

2、TextEdit

3、ComboBox

 4、其他核心输出控件

本期:主要学习输入和输出控件

 一、显示类控件

1、Label

Qt中,QLabel 是一个用于显示文本或图像的控件。它常用于创建静态文本标签、图片显示或在UI中展示非交互内容

核⼼属性如下

属性

说明

text

QLabel中的

textFormat

本的格式.
Qt::PlainText
Qt::RichText 本(持html标签)

Qt::MarkdownText markdown格式
Qt::AutoText 根据本内容动决定本格式.

pixmap

QLabel 内部包含的图.

scaledContents

设为true表内容动拉伸填充 QLabel
设为false则不会动拉伸

alignment

⻬⽅式.
可以设置
平和垂直向如何对.

wordWrap

设为true内部的本会动换.
设为false则内部本不会动换.

indent

设置本缩进.平和垂直向都效.

margin

内部本和边框之间的边距.
不同于于indent,但是是上下左右四个
向都同时有效.
indent最多只是两个向有效(具体哪两个向有效取决于alignment)

openExternalLinks

是否允许打开个外部的链接.
(当QLabel
本内容包含url的时候涉及到)

buddy

给QLabel关联个"伙伴",这样点击QLabel时就能激活对应的伙伴.
例如伙伴如果是
个QCheckBox,那么该QCheckBox就会被选中.

显示图片:

在ui设计中,使用一个label控件

在widget.cpp中编写 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //设置label和窗口一样大
    ui->label->setGeometry(0,0,800,600);

    QPixmap pixmap(":/qt.png");
    ui->label->setPixmap(pixmap);

    //设置内容伸缩
    ui->label->setScaledContents(true);//但是我们拖动窗口,图片的大小不会和窗口大小进行变动

}

void Widget::resizeEvent(QResizeEvent *event)
{
    // 可以直接通过 this->width() 和 this->height() 设置 label 新的尺⼨, 也可以通event 参数拿到新的尺⼨.
     ui->label->setGeometry(0, 0, this->width(), this->height());
//    ui->label->setGeometry((0,0,event->size().width(),event->size().height()));
   qDebug() << event->size();
}

此处的 resizeEvent 函数我们没有⼿动调⽤,但是能在窗⼝⼤⼩变化时被⾃动调⽤.
这个过程就是依赖C++中的多态来实现的.Qt框架内部管理着QWidget对象表⽰咱们的窗
⼝.在窗⼝⼤⼩发⽣改变时,Qt就会⾃动调⽤ resizeEvent 函数.
但是由于实际上这个表⽰窗⼝的并⾮是QWidget,⽽是QWidget的⼦类,也就是咱们⾃⼰写
的Widget.此时虽然是通过⽗类调⽤函数,但是实际上执⾏的是⼦类的函数(也就是我们重写
后的 resizeEvent ).
此处属于是多态机制的⼀种经典⽤法.通过上述过程,就可以把⾃定义的代码,插⼊到框架内
部执⾏.相当于"注册回调函数".

 这里会显示一个全部的图片,而且当我们拖动窗口,图片尺寸也会变化  设置文本

    在ui中设置了二个label标签,并且有&

此处把label中的⽂本设置为"快捷键&A"这样的形式.其中&后⾯跟着的字符,就是快捷键.可以通过alt+A的⽅式来触发该快捷键.

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置label的伙伴widget buddy
    ui->label->setBuddy(ui->radioButton);
    ui->label_2->setBuddy(ui->radioButton_2);
}

2、LCD Number

在Qt中,QLCDNumber 是一个用于显示数字的控件,通常用于模拟液晶数字显示器。QLCDNumber 可以显示整数或浮点数,并支持多种进制(如十进制、十六进制等)。

核⼼属性

属性

说明

intValue

QLCDNumber 的数字值(int).

value

QLCDNumber 的数字值(double).
和intValue是联动的.
例如给value设为1.5,intValue的值就是2.
另外,设置value和intValue的
法名字为 display ,不是 setValue
setIntValue .

digitCount

⽰⼏位数字.

mode

数字显形式.
1. QLCDNumber::Dec 进制模式,显常规的进制数字。
2. QLCDNumber::Hex 六进制模式,以六进制格式显数字。
3. QLCDNumber::Bin 进制模式,以进制格式显数字。
4. QLCDNumber::Oct 进制模式,以进制格式显数字。
只有进制的时候才能显⽰⼩数点后的内容.

segmentStyle

设置显⽰⻛格.
1. QLCDNumber::Flat :平的显⽰⻛格,数字呈现在个平坦的表上。
2. QLCDNumber::Outline :轮廓显⽰⻛格,数字具有清晰的轮廓和阴影效
果。

3. QLCDNumber::Filled :填充显⽰⻛格,数字被填充颜并与背景区分
开。

smallDecimalPoint

设置数点.

 代码示例:倒计时

1)在界⾯上创建⼀个 QLCDNumber ,初始值设为10.
objectName lcdNumbe

2)修改widget.h代码,创建⼀个 QTimer 成员,和⼀个 updateTime 函数

    QTimer* timer;

    void updateTime();

 修改widget.cpp,在构造函数中初始化 QTimer  

QTimer 表⽰定时器.通过 start ⽅法启动定时器之后,就会每隔⼀定周期,触发⼀次
QTimer::timeout 信号.
使⽤ connect QTimer::timeout 信号和 Widget::updateTime 连接起来,意味着每
次触发 QTimer::timeout 都会执⾏ Widget::updateTime

3)修改widget.cpp,在构造函数中初始化 QTimer 

QTimer 表⽰定时器.通过 start ⽅法启动定时器之后,就会每隔⼀定周期,触发⼀次
QTimer::timeout 信号.
使⽤ connect QTimer::timeout 信号和 Widget::updateTime 连接起来,意味着每
次触发 QTimer::timeout 都会执⾏ Widget::updateTime  

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建timer实例
    timer = new QTimer(this);
    //连接信号和槽,每隔一段时间触发timeout信号,把timeout信号和槽函数updateTime连接起来
    connect(timer,&QTimer::timeout,this,&Widget::updateTime);
    //启动QTimer,每隔1000ms
    timer->start(1000);
    //qt为了保证线程安全,所有对界面的操作必须在主线程中完成

}

4)修改widget.cpp,实现 updateTime

通过 intValue 获取到 QLCDNumber 内部的数值.
如果value的值归0了,就停⽌ QTimer .接下来 QTimer 也就不会触发timeout信号了.

void Widget::updateTime()
{
    qDebug()<<"updateTime";
    int value = ui->lcdNumber->intValue();
    if(value<=0)
    {
        //时间到停止计时
        timer->stop();
        return ;
    }
    ui->lcdNumber->display(value-1);
}

 运行程序,时间就开始不断更新

 对于上面的代码,大家可以会有二个想法:

我可以不可以直接在Widget构造函数中,通过⼀个循环+sleep的⽅式是否可以呢?

这里显然是不可以的,因为循环会导致Widget的构造函数⽆法执⾏完毕,此时界⾯是不能正确构造和显⽰的.

那可不可以在Widget构造函数中,另起⼀个线程,在新线程中完成循环+sleep是否可以呢?

这里也是不可以的 Qt中规定,任何对于GUI上内容的操作,必须在主线程中完成.像Widget构造
函数,以及connect连接的slot函数,都是在主线程中调⽤的.⽽我们⾃⼰创建的线程则不是.
当我们⾃⼰的线程中尝试对界⾯元素进⾏修改时,Qt程序往往会直接崩溃.

这样的约定主要是因为GUI中的状态往往是牵⼀发动全⾝的,修改⼀个地⽅,就需要同步的对
其他内容进⾏调整.
⽐如调整了某个元素的尺⼨,就可能影响到内部的⽂字位置,或者其他元素的位置.这⾥⼀连串
的修改,都是需要按照⼀定的顺序来完成的.
由于多线程执行的顺序⽆法保障,因此Qt从根本上禁⽌了其他线程修改GUI状态,避免后续的
⼀系列问题.

 3、ProgressBar

在Qt中,QProgressBar 是一个用于显示任务进度的控件。你可以使用 QProgressBar 来向用户展示任务的完成进度,例如文件下载、数据处理等。QProgressBar 可以是确定性的(有明确的最小值和最大值)或不确定性的(显示为一个持续动画,以表明任务正在进行)。 

核⼼属性

属性

说明

minimum

进度条最

maximum

进度条最

value

进度条当前值

alignment

本在进度条中的对⻬⽅式.

Qt::AlignLeft :左对
Qt::AlignRight :右对
Qt::AlignCenter :居中对
Qt::AlignJustify :两端对

textVisible

进度条的数字是否可.

orientation

进度条的向是平还是垂直

invertAppearance

是否是朝反向增进度

textDirection

本的朝向.

format

的数字格式.
%p :表进度的百分(0-100)
%v :表进度的数值(0-100)
%m :表剩余时间(以毫秒为单位)
%t :表总时间(以毫秒为单位

案例:

在ui界面中创建一个显示进度条控件

 修改widget.h,创建 QTimer updateProgressBar 函数

    QTime* timer;
    void updateProgressBar();

修改widget.cpp,初始化 QTimer
此处设置100ms触发⼀次timeout信号.也就是⼀秒钟触发10次

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::updateProgressBar);
    timer->start(100);
}

修改widget.cpp,实现 updateProgressBar

void Widget::updateProgressBar()
{
    int value = ui->progressBar->value();
    if (value >= 100) {
        timer->stop();
        return;
    }
    ui->progressBar->setValue(value + 1);
}

 4、Calendar Widget

在Qt框架中,QCalendarWidget是一个用于显示和选择日期的日历控件。它提供了一个直观的界面,允许用户通过点击日历来选择日期。

核⼼属性

属性

说明

selectDate

当前选中的

minimumDate

⼩⽇

maximumDate

⼤⽇

firstDayOfWeek

每周的第天(也就是历的第列)是周.

gridVisible

是否显表格的边框

selectionMode

是否允许选择

navigationBarVisible

历上标题是否显

horizontalHeaderFormat

历上标题显期格式

verticalHeaderFormat

历第列显的内容格式

dateEditEnabled

是否允许期被编辑

 重要信号

信号

说明

selectionChanged(const
QDate&)
当选中的期发改变时发出

activated(constQDate&)

当双击个有效的期或者按下回键时发出,形参是个QDate类型,保存
了选中的

currentPageChanged(int,
int)

当年份份改变时发出,形参表改变后的新年份和

在界⾯上创建⼀个 QCalendarWidget 和⼀个label :  objectName calendarWidget , label  

 

QCalendarWidget 添加slot函数

void Widget::on_calendarWidget_selectionChanged()
{
    QDate date = ui->calendarWidget->selectedDate();
    qDebug() << date;
    ui->label->setText(date.toString());
}

二、输出类控件 

1、QLineEdit

在Qt框架中,QLineEdit是一个用于接收单行文本输入的小部件(widget)。它提供了一个简单的文本框,用户可以在其中输入和编辑文本。QLineEdit是一个非常常用的控件,常用于表单、对话框和各种用户输入场景。

核⼼属性

属性

说明

text

框中的

inputMask

内容格式约束

maxLength

⼤⻓

frame

是否添加边框

echoMode

⽰⽅式.
QLineEdit::Normal :这是默认值,本框会显本。
QLineEdit::Password :在这种模式下,输的字符会被隐藏,
通常
星号(*)或等号(=)代替。
QLineEdit::NoEcho :在这种模式下,本框不会显任何输
的字符。

cursorPosition

光标所在位置

alignment

字对⻬⽅式,设置平和垂直向的对.

dragEnabled

是否允许拖拽

readOnly

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

placeHolderText

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

clearButtonEnabled

是否会动显出"清除按钮".

 代码⽰例:验证两次输⼊的密码⼀致

在界面创建二个输入框和一个lable

编写代码,设置两个输⼊框的echoMode 为 Password 

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setEchoMode(QLineEdit::Password);
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}

 给两个输⼊框设置 textEdited slot函数

void Widget::on_lineEdit_textEdited(const QString& 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)
{
	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("两次输⼊的密码不同!");
	}
}

当我们输入相同密码的时候,就会提示密码相同

2、TextEdit

在Qt框架中QTextEdit是一个多行的文本编辑控件,用于显示和编辑富文本或纯文本。QLineEdit不同,QTextEdit可以处理多行文本,并且支持各种文本格式和样式。

核心属性

属性

说明

markdown

框内持有的内容.持markdown格式.能够动的对markdown本进
渲染成html

html

框内持有的内容.可以部分html标签.包括img和table等.

placeHolderText

框为空时提的内容.

readOnly

是否是只读的

undoRedoEnable

是否开启undo/redo功能.
按下ctrl+z触发undo
按下ctrl+y触发redo

autoFormating

开启动格式化.

tabstopWidth

按下缩进占多少空间

overwriteMode

是否开启覆盖写模式

acceptRichText

是否接收富⽂本内容                                          

 核⼼信号

信号

说明

textChanged()

本内容改变时触发

selectionChanged()

选中范围改变时触发

cursorPositionChanged()

光标移动时触发

undoAvailable(bool)

可以进undo操作时触发

redoAvailable(bool)

可以进redo操作时触发

copyAvaiable(bool)

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

代码⽰例:获取多⾏输⼊框的内容

创建ui控件


 

给多⾏输⼊框添加slot函数.处理 textChanged 信号.

void Widget::on_textEdit_textChanged()
{
    const QString& content = ui->textEdit->toPlainText();
    qDebug()<<content;
    ui->label->setText(content);
}

运行输入,将输入框中的内容同步到Lable中, 


 

3、ComboBox

  在Qt框架中,QComboBox是一个用于显示下拉列表的控件。它允许用户从预定义的选项列表中进行选择。QComboBox可以显示静态列表,也可以动态添加和删除项目。

核心属性

属性说明

currentText

当前选中的⽂本

currentIndex

当前选中的条⽬下标.从0开始计算.如果当前没有条被选中,值为-1

ditable是否允许修改
设为true时,
QComboBox 为就常接近 QLineEdit ,也可以
设置
validator
iconSize 下拉框图标()⼤⼩

核⼼⽅法

说明

addItem(constQString&)

添加个条

currentIndex()

获取当前条的下标
从0开始计算.如果当前没有条
被选中,值为-1

currentText()

获取当前条本内容.

 核⼼信号

说明

activated(int)
activated(constQString&text)

⽤户选择了个选项时发出.这个时候相当于⽤户点开下拉框,并且标划过某个选项.此时还没有确认做出选择.

currentIndexChanged(int)
currentIndexChanged(constQString
&text)

当前选项改变时发出.此时⽤⼾已经明确的选择了个选项.
⽤⼾操作或者通过程序操作都会触发这个信号.

editTextChanged(constQString&
text)

当编辑框中的本改变时发出
(editable为true时有效)

 代码⽰例:⽤下拉框模拟⻨当劳点餐

 在ui界面中创建三个下拉框comboBox

在widget.cpp中初始化下拉框中条目的内容 ,并且添加对应的slot函数

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //给下拉框添加条目
    ui->comboBox->addItem("汉堡1");
    ui->comboBox->addItem("汉堡包2");

    ui->comboBox_2->addItem("小吃1");
    ui->comboBox_2->addItem("小吃2");

    ui->comboBox_3->addItem("饮料1");
    ui->comboBox_3->addItem("饮料2");
}

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


void Widget::on_pushButton_clicked()
{
    qDebug()<<"汉堡选择"<<ui->comboBox->currentText();
    qDebug()<<"小吃选择"<<ui->comboBox_2->currentText();
    qDebug()<<"饮料选择"<<ui->comboBox_3->currentText();
}

 4、其他核心输出控件

其他有一些非常核心的控件:SpinBox,DateEdit&TimeEdit,Dial,Slider。这些控件的都无非要学习其核心属性和核心方法,这里就不为大家一一解析了,大家可以不清楚的直接可以去查官方的文档

在Qt框架中,QSpinBox是一个用于接收整数输入的控件。它提供了一个数字输入框和上下箭头,用户可以通过点击箭头或直接输入来改变数字值。QSpinBox还允许设置最小值、最大值和步长

 对于这种微调框,在点餐系统中就是,数量的选择。

在Qt框架中,QDateEditQTimeEdit是两个控件,分别用于处理日期和时间的输入。它们提供了一个类似于QLineEdit的输入框,并附带上下箭头,用户可以通过点击箭头或直接输入来改变日期和时间的值。

这二个控件的核心点就是能够处理日期和时间,我们就可以依靠这二个控件完成一个简单的日期计算器

在Qt框架中,QDial是一个圆形的控件,类似于旋钮,用于接收用户的输入值QDial的工作方式类似于QSlider,但它具有圆形界面,使其更适合某些类型的应用程序,例如音量控制、亮度调整等。 

Dial就是如下图的一个圆形控件,这里我们用dial来控制窗口的透明度.

 在Qt框架中,QSlider是一个用于接收用户输入的控件,它提供了一个滑动条,用户可以通过拖动滑块来选择一个数值。QSlider可以设置为水平或垂直方向,常用于音量控制、进度条等场景。

这个其实和Dial控件的用途非常类似,无非就是状态上的区别

 这里我们让slider控制窗口的大小

核心控件的细节非常多,大家光靠看文档还是很难掌握,大家还是要多多使用。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python武器库开发-武器库篇之SQL注入扫描器(五十九)

Python武器库开发-武器库篇之SQL注入扫描器(五十九) SQL注入漏洞简介以及危害 SQL注入漏洞是一种常见的Web应用程序漏洞&#xff0c;攻击者可以利用该漏洞在应用程序的数据库中执行恶意的SQL查询或指令。这可能导致数据泄露、数据损坏、应用程序崩溃或未经授权的访问。 SQL注…

L51--- 144. 二叉树的前序遍历(深搜)---Java版

1.题目描述 2.思路 二叉树的前序遍历遵循 根左右 &#xff08;1&#xff09;方法 preorderTraversal 输入参数: TreeNode root root是二叉树的根节点。 返回值: List 返回一个包含二叉树节点值的列表&#xff0c;这些值按照前序遍历的顺序排列。 功能: 这个方法是前序遍历的…

剖析 Kafka 消息丢失的原因

文章目录 前言一、生产者导致的消息丢失的场景场景1&#xff1a;消息太大解决方案 &#xff1a;1、减少生产者发送消息体体积2、调整参数max.request.size 场景2&#xff1a;异步发送机制解决方案 &#xff1a;1、使用带回调函数的发送方法 场景3&#xff1a;网络问题和配置不当…

React 中的 ErrorBoundary

在 React 中&#xff0c;如果不做任何控制&#xff0c;当组件出现异常时&#xff0c;React 渲染就会停止&#xff0c;页面出现白屏&#xff0c;这种体验很不好。例如当用户输入某些非法数据&#xff0c;而前端都没有进行校验&#xff0c;页面出现白屏。这种情况下&#xff0c;最…

如何训练AI大模型?熬夜爆肝整理大全

随着人工智能技术的快速发展&#xff0c;大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。然而&#xff0c;训练AI大模型面临着…

20240616日志:大模型压缩方法DMS

Location: Beijing 1 大模型剪枝 Fig. 1.1大模型压缩-剪枝 剪枝的理论来源基于彩票假设&#xff08;Lottery Ticket Hypothesis&#xff09;&#xff0c;指在神经网络中存在一种稀疏连接模式&#xff0c;即仅利用网络的一小部分连接&#xff08;彩票&#xff09;就足以实现与整…

npm语义化版本和版本运算符

版本号组成 一个完整的版本号&#xff0c;由三部分组成&#xff1a;主版本号&#xff08;major&#xff09;、次版本号(minor)、修订版本号(patch)&#xff0c;简称X.Y.Z&#xff0c;具体含义&#xff1a; 主版本号&#xff08;major&#xff09;&#xff1a;项目&#xff08…

环境搭建---单机k8s

配置基础环境 关闭防火墙 [rootVM-20-14-centos ~]# systemctl stop firewalld && systemctl disable firewalld关闭selinux [rootVM-20-14-centos ~]# setenforce 0 && sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config禁止s…

【Java】已解决java.lang.NullPointerException异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.lang.NullPointerException异常 一、问题背景 在Java编程中&#xff0c;java.lang.NullPointerException&#xff08;空指针异常&#xff09;是一种常见的运行时异常。当应…

封装音视频编解码和渲染的动态链接库编译和测试

1.动态链接库的编译 生成了以下几个文件 我们把生成的lib文件复制到lib文件夹中 其余三个文件不变动 2.进行测试看是否可以用生成的xcodec.lib库文件里的接口函数 以上是重新创建的新项目&#xff0c;导入了xcodec.lib&#xff0c;其他配置同以前项目 库测试结果 运行显示我们…

【Linux环境下Hadoop部署】— 报错“bash: myhadoop.sh: command not found“

项目场景&#xff1a; 执行 “myhadoop.sh stop” 命令。 问题描述 bash: myhadoop.sh: command not found 原因分析&#xff1a; 查看我们的系统配置&#xff0c;发现没有myhadoop.sh文件存放的路径。 解决方案&#xff1a; 1、执行 “sudo vim /etc/profile” 命令&#xff…

不入耳的蓝牙耳机平价推荐,五大爆款分析测评

开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势。它作为骨传导耳机&#xff0c;深受用户的喜爱&#xff0c;不仅可以随时感知周围环境&#xff0c;还提供了高质量的音效体验&#xff0c;对于热爱运动的人士而言&#xff0c;高品质的骨传导耳机无疑是首选。同时&#…

看完轻松解决家里灰尘毛絮多难题?除粉尘的空气净化器品牌分享

家里的空气中弥漫着灰尘和毛絮&#xff0c;让人呼吸不畅&#xff0c;也影响着家人的健康。灰尘中含有各种有害物质&#xff0c;如细菌、病毒、花粉等&#xff0c;长期吸入会导致呼吸道疾病、皮肤过敏等问题。尤其是对于有宠物、孩子、过敏人群来说&#xff0c;空气质量更是至关…

【Linux】进程间通信3——system V共享内存

1.system V进程间通信 管道通信本质是基于文件的&#xff0c;也就是说操作系统并没有为此做过多的设计工作&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样&#xff0c;它们的本质都是一样的&#xff0c;都是在想尽办法让不同的进程看到同一份由操…

鸿蒙实现自定义Tabbar样式,显示数字红点提示

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 Tabs的链接参考&#xff1a;OpenHarmony Tabs TabContent的链接参考&#xff1a;OpenHarmony TabContent 通过查看链接参考我们知道可以通过TabContent的tabBar来实现自定义TabBar样式&#xff08;CustomBuilder&…

SAP ABAP开发:如何读取物料主数据中的长文本?

在SAP ERP系统中&#xff0c;物料的基本描述可存储40个字符&#xff0c;见下图&#xff1a; 但长文本信息如何从系统中读取呢&#xff1f; 在SAP ABAP开发中&#xff0c;读取物料主数据&#xff08;Material Master Data&#xff09;中的基本视图&#xff08;Basic View&#…

UNetMultiLane 多车道线、车道线类型识别【训练+部署】

基于UNet 分割模型增加了检测头来识别车道线的类型&#xff08;单实线、双黄线等10种&#xff09;&#xff0c;同时可以识别出"所在车道"和"车道线类型"。 训练代码【训练练手代码】 1 数据说明 基于开源数据集 VIL100。其中数据标注了所在的六个车道的车…

《python程序语言设计》2018版第5章第49题l利用turtle绘制乘法口诀表,结果放在最后

2024.06.09 05.49.01version 2024.06.10 05.49.02 经历了一天的奔波&#xff0c;发了两篇博客 开始来到这道题。已经22点了 turtle.penup() turtle.goto(-80, 0) turtle.pendown() turtle.write("Multiplication Table\n", font("", 18, "")) t…

005-OSPF基本配置

OSPF基本配置 OSPF (Open Shortest Path First) 是一种链路状态路由协议&#xff0c;它属于内部网关协议&#xff08;IGP&#xff09;类别&#xff0c;用于在自治系统&#xff08;AS&#xff09;内部路由 IP 数据包。OSPF 通过使用 Dijkstra 算法计算最短路径树来确定到达每个…

SpringBoot + thymeleaf 修改文件,刷新页面不能实时展示修改后的内容问题解决

修改页面后文件后&#xff0c;刷新页面&#xff0c;内容不变&#xff0c;是因为项目没有编译&#xff0c;没有将新的页面文件编译&#xff0c;以下方法可以完美解决次问题 具体内容请查看&#xff1a;http://www.haozgx.top/blog/article/2