Qt 常用控件 - 5

Qt 常用控件 - 4https://blog.csdn.net/Small_entreprene/article/details/149830464

前文补充 

QRadioButton(单选按钮)

QRadioButton 是单选按钮,允许在多个选项中选择一个。作为 QAbstractButton 和 QWidget 的子类,前面介绍的属性和用法对 QRadioButton 同样适用。

QAbstractButton 中与 QRadioButton 关系较大的属性
属性说明
checkable是否能选中
checked是否已经被选中。checkable 是 checked 的前提条件。
autoExclusive是否排他。选中一个按钮后是否会取消其他按钮的选中。QRadioButton 默认排他。
代码示例:选择性别
  1. 在界面上创建一个 label 和 3 个单选按钮,文本分别为“男”“女”“其他”,objectName 分别为 radioButton_maleradioButton_femaleradioButton_other

  2. 修改 widget.cpp,编辑三个 QRadioButton 的 slot 函数:

void Widget::on_radioButton_male_clicked()
{// 将界面上的内容进行更新ui->label->setText("您选择的性别为:男");
}void Widget::on_radioButton_female_clicked()
{// 将界面上的内容进行更新ui->label->setText("您选择的性别为:女");
}void Widget::on_radioButton_other_clicked()
{// 将界面上的内容进行更新ui->label->setText("您选择的性别为:其他");
}

运行程序,选择不同单选按钮,label 提示文字随之变化。开始没有任何的选中

程序启动时默认不选任何选项,可修改为默认选中“男”:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//添加一个默认的选型ui->radioButton_male->setChecked(true);//此时单选按钮就被选中了ui->label->setText("您选择的性别为:男");
}

可禁用“其他”选项:在构造函数之后接续代码:

// 仅禁止选中但仍能触发点击 --- 文本还是会变化
ui->radioButton_other->setCheckable(false);// 彻底禁用(无法选中也无法响应输入)
ui->radioButton_other->setEnabled(false);
// ui->radioButton_other->setDisabled(true);//这个也一样的作用

代码示例:click, press, release, toggled 的区别

  • clicked:一次“点击”(按下+释放 = pressed + released)我们无参的使用多了,我们下面使用带参的

  • pressed:鼠标“按下”

  • released:鼠标“释放”

  • toggled:按钮状态切换(checked 属性改变)

  1. 在界面上创建四个单选按钮,objectName 为 radioButtonradioButton_4

  2. 分别创建槽函数:

void Widget::on_radioButton_clicked(bool checked)
{// 这个 checked 参数就是表示当前 radiobutton 的选中状态qDebug() << "clicked: " << checked;
}void Widget::on_radioButton_2_pressed()
{qDebug() << "pressed";
}void Widget::on_radioButton_3_released()
{qDebug() << "releaseed";
}void Widget::on_radioButton_4_toggled(bool checked)
{// checked 状态发生改变,就会触发这个信号qDebug() << "toggled: " << checked;
}

运行程序,观察不同信号触发时机。

总结:toggled 最适合 QRadioButton!!!

代码示例:单选框分组

基于 RedioButton,实现一个简单的模拟点餐的功能!

  1. 在界面上创建 6 个单选框,objectName 为 radioButtonradioButton_6,默认是全部排他。

  2. 一旦页面上是需要存在“多组单选按钮”的时候,希望组合组之间不要有影响。

  3. Qt 引入 QButtonGroup 这样的工具类进行分组,每组内部排他,组间互不影响:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 使用 QButtonGroup 对单选按钮进行分组QButtonGroup* group1 = new QButtonGroup(this);QButtonGroup* group2 = new QButtonGroup(this);QButtonGroup* group3 = new QButtonGroup(this);// 把对应单选按钮,放在不同的组里group1->addButton(ui->radioButton);group1->addButton(ui->radioButton_2);group1->addButton(ui->radioButton_3);group2->addButton(ui->radioButton_4);group2->addButton(ui->radioButton_5);group2->addButton(ui->radioButton_6);group3->addButton(ui->radioButton_7);group3->addButton(ui->radioButton_8);
}

再次运行程序,即可实现正确的分组排他。


QCheckBox(复选按钮)

QCheckBox 表示复选按钮,允许选中多个。与 QCheckBox 最相关的属性同样继承自 QAbstractButton:checkablechecked

tristate 为 QCheckBox 独有,可实现“三态复选框”,较冷门,暂时不讨论。

代码示例:获取复选按钮的取值
  1. 在界面上创建三个复选按钮和一个普通按钮,objectName 分别为 checkBox_eatcheckBox_sleepcheckBox_playpushButton

  2. pushButton 添加 slot 函数:

void Widget::on_pushButton_clicked()
{QString result = "今天你的安排是: ";if(ui->checkBox_study->isChecked()){result += ui->checkBox_study->text() + " ";}if(ui->checkBox_game->isChecked()){result += ui->checkBox_game->text() + " ";}if(ui->checkBox_work->isChecked()){result += ui->checkBox_work->text() + " ";}ui->label->setText(result);
}

运行程序,点击确认按钮,控制台输出选中的内容。


Tool Button(QToolButton)

QToolButton 的大部分功能与 QPushButton 一致,但主要应用于工具栏、菜单等场景,此处暂不介绍。

介绍完了按钮类控件,接下来,我们开启对显示类控件的介绍!

显示类控件

QLabel(标签)

QLabel 可以用来显示文本和图片。核心属性如下:

属性说明
textQLabel 中的文本
textFormat

文本的格式:

  1. Qt::PlainText 纯文本 
  2. Qt::RichText 富文本(支持 HTML 标签,word 工具,编辑文件,就可以认为是一种富文本)  
  3. Qt::MarkdownText Markdown 格式(作为程序猿,markdown 是一个非常常用的书写文档的格式,提供了各种特殊的符号,表示不同的样式/格式
  4. Qt::AutoText根据文本内容自动决定文本格式
pixmapQLabel 内部包含的图片 --- 这是单纯为了放图片的更好的选择!
scaledContents设为 true 表示内容自动拉伸填充 QLabel;设为 false 则不会自动拉伸
alignment对齐方式。可以设置水平和垂直方向如何对齐(左/右居中,上/下居中)
wordWrap

设为 true 内部的文本会自动换行;设为 false 则内部文本不会自动换行(文本长度超出了Label本身,是否要自动换行,QLabel 是不会给我们提供滚动条的,有的控件,QTEXTEdit --- 多行编辑框是有滚动条的)

indent设置文本缩进。水平和垂直方向都生效(两个方向)
margin内部文本和边框之间的边距。不同于 indent,上下左右四个方向同时有效
openExternalLinks是否允许打开一个外部的链接(当 QLabel 文本内容包含 url 时涉及到)
buddy给 QLabel 关联一个“伙伴”,点击 QLabel 时就能激活对应的伙伴。例如伙伴是一个 QCheckBox,则该 QCheckBox 就会被选中

代码示例:显示不同格式的文本 - textFormat
  1. 在界面上创建三个 QLabel,尺寸放大一些,objectName 分别为 labellabel_2label_3

  2. 修改 widget.cpp,设置三个 label 的属性:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 把第一个label 设置成显示纯文本ui->label->setTextFormat(Qt::PlainText);ui->label->setText("这是一段纯文本");// 把第二个label 设置成显示富文本ui->label_2->setTextFormat(Qt::RichText);ui->label_2->setText("<b>这是一段富文本<\b>");//<b>标签:进行文本加粗// 把第三个label 设置成显示markdownui->label_3->setTextFormat(Qt::MarkdownText);ui->label_3->setText("# 这是 markdown 文本");//# :让文本成为一级标题
}

运行程序,观察效果:


代码示例:显示图片

虽然 QPushButton 也可以通过设置图标的方式设置图片,但并非好选择。更多时候希望通过 QLabel 作为更单纯的显示图片方式。

  1. 在界面上创建一个 QLabel,objectName 为 label

  2. 创建 resource.qrc 文件,并把图片导入到 qrc 中。

  3. 修改 widget.cpp,给 QLabel 设置图片:

先将 Qlable 设置为和窗口一样大,并且被这个 QLabel 左上角设置到窗口的左上角

让整个 QLabel 铺满整个窗口,我们可以通过窗口的 geometry 来获取:

// 先将 Qlable 设置为和窗口一样大,并且被这个 QLabel 左上角设置到窗口的左上角
// 让整个 QLabel 铺满整个窗口
QRect windowRect = this->geometry();
ui->label->setGeometry(0, 0, windowRect.width(), windowRect.height());
// ui->label->setGeometry(0, 0, 800, 600);//硬编码QPixmap pixmap(":/dog.png");
ui->label->setPixmap(pixmap);

执行程序,观察效果。我的图片本身尺寸是 200×200,并没有把 QLabel 填充满。

修改代码,设置 scaledContents 属性:来实现自动拉伸的填充 Label

// 设置内容伸缩
ui->label->setScaledContents(true);

再次运行,图片已被拉伸填满窗口。

此时拖动窗口大小,图片不会同步变化。上面的代码是在构造函数中,进行的如上的尺寸设置,这个设置相当于是一次性的,一旦程序运行起来之后,QLabel 的尺寸就固定下来了,窗口发生改变,此时,QLabel 是不会变化的!

我们需要介绍一个知识点 --- 事件

对于之前的信号和槽,用户的操作会对应一些信号(点击按钮,触发指定信号),有些用户操作,对应的不是信号,而是事件!

所以在 Qt 中,表示用户的操作,有两类概念:一个是信号,另一个是事件!对于事件,后续会详细介绍,当前我们就来简单起个头:

就像我们鼠标拖动窗口大小的时候,就会让我们的 Qt 程序触发一个 resize 事件(resizeEvent),像这种事件是连续触发的:将窗口尺寸从 A 拖到 B 这个过程中,会连续触发一系列的 resizeEvent!之前的信号是点一下,只触发一下信号

此时接可以借助 resizeEvent 来完成上述的功能!

为解决此问题,可在 Widget 中重写父类(QWidget)的 resizeEvent 虚函数:

在实际编程中,指定回调函数其实有很多种写法:

  • 设置函数指针
  • 设置仿函数函数对象
  • 设置 lambda 表达式
  • 重写父类虚函数 --- (框架中拿着父类的指针调用这个函数,如果你创建的子类重写了这个函数,此时在多态机制下,实际执行的就是子类的函数了)
// 重写 resizeEvent. 这个函数会在窗口大小发生改变时被自动调用。
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)。此处属于多态机制的经典用法,通过上述过程可把自定义代码插入到框架内部执行,相当于“注册回调函数”。


代码示例:文本对齐、自动换行、缩进、边距

创建四个 label,objectName 分别为 labellabel_4,并在 QFrame 中设置 frameShape 为 Box(设置边框后看起来更清晰)。

QFrame 是 QLabel 的父类,frameShape 属性用来设置边框性质:

  • QFrame::Box:矩形边框
  • QFrame::Panel:带有可点击区域的面板边框
  • QFrame::WinPanel:Windows 风格的边框
  • QFrame::HLine:水平线边框
  • QFrame::VLine:垂直线边框
  • QFrame::StyledPanel:带有可点击区域的面板边框,样式取决于窗口主题

编写 widget.cpp,给四个 label 设置属性:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置文字居中对齐ui->label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);ui->label->setText("垂直and水平居中的文本");// 设置自动换行ui->label_2->setAlignment(Qt::AlignTop | Qt::AlignLeft);ui->label_2->setWordWrap(true);ui->label_2->setText("这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本");// 设置首行缩进ui->label_3->setAlignment(Qt::AlignTop | Qt::AlignLeft);ui->label_3->setIndent(20);ui->label_3->setText("这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本");// 设置边距ui->label_4->setAlignment(Qt::AlignTop | Qt::AlignLeft);ui->label_4->setMargin(20);ui->label_4->setText("这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本这是一个很长的文本");
}

运行程序,效果如下:

  • 第一个 label 垂直水平居中

  • 第二个 label 设置了 wordWrap,能够自动换行

  • 第三个 label 设置了 indent,左侧和上方与边框有间距,右侧则没有

  • 第四个 label 设置了 margin,四个方向均有间距(图上仅体现三个方向,下方看不出来)


代码示例:设置伙伴

QLabel 的伙伴:就是可以将 QLabel 和单选框或者复选框这样的控件绑定成伙伴关系 --- 此时就可以通过 QLabel 来触发单选框/复选框的选择操作!

创建两个 label 和两个 radioButton,objectName 分别为 labellabel_2radioButtonradioButton_2

此处把 label 中的文本设置为 "快捷键 &A" 这种形式,其中 & 后面的字符就是快捷键,可通过 Alt + A 触发。注意这里的快捷键和 QPushButton 不同,需要搭配 Alt 和单个字母才能触发。

编写 widget.cpp,设置 buddy 属性(也可在 Qt Designer 直接设置):

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

运行程序,按下快捷键 Alt + A 或 Alt + B,即可选中对应选项。

Qt 中,QLbel 中写的文本,是可以指定“快捷键”的,此处的快捷键的规则功能上要比 QPushButton 弱很多,使用方式是:

在文本中使用"&"跟上一个字符来表示快捷键,比如:

"&A" --- 通过键盘上的 Alt + a 来触发这个快捷键;

"&B" --- 通过键盘上的 Alt + b 来触发这个快捷键。

绑定了伙伴关系之后,通过快捷键就可以选中对应的单选框/复选框了!

LCDNumber(数字显示)

QLCDNumber 是专门用来显示数字的控件,类似老式计算器的效果。

核心属性
属性说明
intValueQLCDNumber 显示的数字值(int)。
value

QLCDNumber 显示的数字值(double)与 intValue 联动;

例如给 value 设为 1.5,intValue 的值就是 2;

另外,设置 value 和 intValue 的方法名为 display,而非 setValue 或 setIntValue。

digitCount显示几位数字。
mode数字显示形式:
  • QLCDNumber::Dec — 十进制模式,显示常规十进制数字

  • QLCDNumber::Hex — 十六进制模式,以十六进制格式显示数字

  • QLCDNumber::Bin — 二进制模式,以二进制格式显示数字

  • QLCDNumber::Oct — 八进制模式,以八进制格式显示数字

仅十进制可显示小数点后内容

segmentStyle显示风格:
  • QLCDNumber::Flat — 平面风格,数字呈现在平坦表面

  • QLCDNumber::Outline — 轮廓风格,数字带清晰轮廓和阴影

  • QLCDNumber::Filled — 填充风格,数字被填充颜色并与背景区分

smallDecimalPoint设置较小的小数点。
代码示例:倒计时

界面放一个 QLCDNumber,初始值设为 10,objectName 为 lcdNumber。

// 设置初始值
ui->lcdNumber->display("10");

修改 widget.h 代码,增加成员:创建一个 QTimer 成员,和一个 updateTime 函数

QTimer* timer;
void updateTime();

widget.cpp 构造函数初始化 QTimer

  1. QTimer 表⽰定时器,这个类创建出来的对象,就会产生一个 timeout 这样的信号,通过 start ⽅法启动定时器之后,并且参数中设定触发 timeout 信号的周期,就会每隔⼀定周期,触发⼀次 QTimer::timeout 信号 --- C++标准库没有提供定时器的实现,但是boost库中提供了对应的功能!Qt 封装了对应的定时器(结合了信号槽机制)
  2. 我们就可以结合 connect,把这个 timeout 信号绑定到需要的槽函数中,就可以执行逻辑,修改 LCDNumber 中的数字了 --- 使⽤ connect 把 QTimer::timeout 信号和 Widget::updateTime 连接起来,意味着每次触发 QTimer::timeout 都会执⾏ Widget::updateTime
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置初始值ui->lcdNumber->display("10");// 创建一个 QTimer 实例timer = new QTimer(this);// 把 QTimer 的 timeout 信号和咱们自己的槽函数进行连接connect(timer, &QTimer::timeout, this, &Widget::updateTime);// 启动定时器,参数是触发 timeout 的周期,单位是 mstimer->start(1000);
}

widget.cpp 实现 updateTime

  1. 通过 intValue 获取到 QLCDNumber 内部的数值。
  2. 如果 value 的值归 0 了,就停止 QTimer --- timer->stop()。接下来 QTimer 也就不会触发 timeout 信号了。
void Widget::updateTime()
{// qDebug()<<"过了一秒";// 先拿到 LCDNumber 中的数字int value = ui->lcdNumber->intValue();if(value <= 0){// 数字减到0了,要停止定时器timer->stop();//timer 设置成成员变量!!!return;}ui->lcdNumber->display(value-1);
}

运行程序,每秒钟数字减 1。

针对上述代码的两个问题

1.上述代码如果直接在 Widget 构造函数中,通过一个循环 + sleep 的方式是否可以呢?

代码形如:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);int value = ui->lcdNumber->intValue();while(true){// 先休眠 1秒 --- 获取当前线程的sleepstd::this_thread::sleep_for(std::chrono::seconds(1));if(value <=0 ){break;}ui->lcdNumber->display(--value);}
}

我们执行程序,一段时间之间内是没有显示出来执行的程序的,而是等了一会,但是出来的界面已经是0了!

显然,这个代码是不行的。循环会使 Widget 的构造函数无法执行完毕,此时界面是不能正确构造和显示的。而是需要将 Widget 构造完成,才可以执行后续的界面显示!都没显示出来?有什么用???

2.上述代码如果是在 Widget 构造函数中,另起一个线程,在新线程中完成循环 + sleep 是否可以呢?那我们另外搞一个线程不就不会阻塞当前线程了嘛,不就可以让构造函数顺利执行完,顺利进行展示窗口了嘛???

代码形如:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);std::thread t([this]() {int value = this->ui->lcdNumber->intValue();while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));if (value <= 0) {break;}this->ui->lcdNumber->display(value - 1);}});
}

这个代码同样是不行的。Qt 中规定,任何对于 GUI 上内容的操作,必须在主线程中完成。像 Widget 构造函数,以及 connect 连接的 slot 函数,都是在主线程中调用的。而我们自己创建的线程则不是。当我们自己的线程中尝试对界面元素进行修改时,Qt 程序往往会直接崩溃。

✍ 这样的约定主要是因为 GUI 中的状态往往是牵一发而动全身的,修改一个地方,就需要同步地对其他内容进行调整。

比如调整了某个元素的尺寸,就可能影响到内部的文字位置,或者其他元素的位置。这里一连串的修改,都是需要按照一定的顺序来完成的。

由于多线程执行的顺序无法保障,因此 Qt 从根本上禁止了其他线程修改 GUI 状态,避免后续的一系列问题。

综上所述,使用定时器,是实现上述功能的最合理方案。后续如果我们也有类似的需要“周期性修改界面状态”的需求,也需要优先考虑使用定时器。

QProgressBar(进度条)

使用 QProgressBar 表示一个进度条。

注意:不要把 ProgessBar 拼写成 ProcessBar!

核心属性
属性说明
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 : 表示总时间(以毫秒为单位)

代码示例:设置进度条按时间增长

在界面上创建进度条,objectName 为 progressBar

其中最小值设为 0,最大值设为 100当前值设为 0

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

QTimer* 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); // 100ms触发一次timeout信号,即一秒钟触发10次
}

修改 widget.cpp,实现 updateProgressBar

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

运行程序,可以看到进度条中的进度在快速增长

实际开发中,进度条的取值通常根据当前任务的实际进度设置:

例如读取大文件时,可以根据文件总大小和已读取大小设置进度条比例

Qt禁止在其他线程修改界面,因此进度条更新通常需要搭配定时器完成

  • 通过定时器周期触发信号

  • 主线程调用对应的slot函数

  • 在slot函数中计算当前任务进度并更新界面

代码示例:创建红色进度条

上述的进度条使用表示紫色的,但是考虑到有些人可能不喜欢紫色,因此改成红色的进度条。
不要忘了,QProgressBar 同样也是 QWidget 的子类,因此可以使用 styleSheet 通过样式来修改进度条的颜色。

在界面上创建一个进度条

在Qt Designer右侧属性编辑器中,找到QWidget的styleSheet属性,编辑如下内容:

QProgressBar::chunk {background-color: #FF0000;
}

同时把QProgressBar的alignment属性设置为垂直水平居中

注意:如果不设置alignment,进度条中的数字可能会跑到左上角,这可能是Qt的bug,暂时只能手动调整对齐方式

执行程序,可以看到红色进度条效果:

通过上述方式,也可以修改文字的颜色、字体大小等样式

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

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

相关文章

vue的响应式原理

Vue.js 的响应式原理是其核心特性之一&#xff0c;使得数据变化能够自动更新到视图。Vue 的响应式系统主要依赖于 Object.defineProperty&#xff08;在 Vue 2.x 中&#xff09;和 Proxy&#xff08;在 Vue 3.x 中&#xff09;来实现数据的观察和更新。以下是对 Vue 响应式原理…

【AI论文】PixNerd:像素神经场扩散

摘要&#xff1a;扩散变换器目前所取得的成功在很大程度上依赖于预训练变分自编码器&#xff08;VAE&#xff09;所塑造的压缩潜在空间。然而&#xff0c;这种两阶段训练模式不可避免地会引入累积误差和解码伪影。为解决上述问题&#xff0c;研究人员选择回归像素空间&#xff…

Java中的LambdaMetafactory:动态生成Lambda的底层黑魔法

引言 在Java 8中&#xff0c;Lambda表达式作为最引人注目的新特性之一被引入。但你是否曾好奇过&#xff0c;这些简洁的Lambda表达式在底层是如何实现的&#xff1f;这就是LambdaMetafactory发挥作用的地方。作为Java语言中一个不太为人所知但极其重要的类&#xff0c;LambdaMe…

看不见的伪造痕迹:AI时代的鉴伪攻防战

在生成式人工智能飞速发展的今天&#xff0c;“眼见为实”这句话的有效性正面临前所未有的挑战。以往&#xff0c;图像篡改往往通过传统的图像处理工具&#xff08;如 Photoshop&#xff09;进行&#xff0c;需要较高的技术门槛和人工成本&#xff1b;而现在&#xff0c;仅需通…

《React+TypeScript实战:前端状态管理的安全架构与性能优化深解》

当用户在界面上进行表单提交、数据筛选等操作时,每一次交互的精准响应,都依赖于底层状态架构对风险的预判与性能的调控。深入理解如何在功能实现之外,构筑一套兼顾状态安全与运行高效的体系,是从基础开发迈向工程化实践的关键一跃。状态管理机制的设计,需要穿透“数据更新…

【android bluetooth 协议分析 01】【HCI 层介绍 30】【hci_event和le_meta_event如何上报到btu层】

一、引言 在蓝牙协议栈中&#xff0c;HCI Event 和 LE Meta Event 是控制器&#xff08;Controller&#xff09;向主机&#xff08;Host&#xff09;报告事件的两种形式&#xff0c;它们属于 HCI&#xff08;Host Controller Interface&#xff09;层。这是主机和控制器之间通…

小实验--震动点灯

1.实验目的 使用中断的方法&#xff0c;震动传感器检测到震动时&#xff0c;LED1点亮2秒&#xff0c;之后熄灭。 2.硬件清单 震动传感器STM32开发板ST-Link 3.硬件连接STM32震动传感器PA4DO3V3VCCGNDGND4.代码 4.1exti.c #include "exti.h" #include "sys.h&quo…

vcpkg: 一款免费开源的C++包管理器

目录 1.简介 2.安装 3.常用命令 4.与项目集成 5.vcpkg的工作原理 5.1.包索引&#xff1a;ports 系统&#xff08;定义库的 “元信息”&#xff09; 5.2.源码获取&#xff1a;从 “地址” 到 “本地缓存” 5.3.编译构建&#xff1a;按 “triplet” 定制目标 5.4.安装布…

WinCC通过无线Modbus TCP监控S7-1200/200SMT PLC实例详解

工业自动化系统中&#xff0c;车间内通常部署多台PLC设备并需通过中央监控平台实现集中管控。考虑到工业现场设备间距普遍在数十至数百米范围&#xff0c;传统有线以太网虽能保障传输速率&#xff0c;但其施工需面临电缆沟开挖或复杂布线工程&#xff0c;既增加线材采购、人力投…

【AI智能编程】Trae-IDE工具学习

什么是Trae&#xff1f; Trae与 AI 深度集成&#xff0c;提供智能问答、代码自动补全以及基于 Agent 的 AI 自动编程能力。使用 Trae 开发项目时&#xff0c;你可以与 AI 灵活协作&#xff0c;提升开发效率。提供传统的 IDE 功能&#xff0c;包括代码编写、项目管理、插件管理…

智能驾驶再提速!批量苏州金龙L4级自动驾驶巴士交付杭州临平区

近日&#xff0c;由苏州金龙海格客车研发的“清源”L4级自动驾驶巴士现身杭州市临平区并投入测试。这是临平区引进的首批L4级自动驾驶巴士&#xff0c;标志着临平区智能交通建设迈入新阶段。此次投入测试的“清源”小巴采用一级踏步设计&#xff0c;车身延续了海格蔚蓝巴士的经…

Spring_事务

在mysql阶段的文章中&#xff0c;已经介绍过事务了。本篇文章是对mysql事务的总结和对使用Spring框架来实现事务操作的讲解。事务回顾什么是事务事务时一组操作的集合&#xff0c;是一个不可分割的操作。事务会把所有操作作为一个整体&#xff0c;一起向数据库提交或者撤销操作…

事务管理介绍

为什么要用事务管理在我们同时操作两个或更多个数据库时&#xff0c;可能因为网络等各方面原因导致中间出现异常。造成像对第一个数据库的操作成功了&#xff0c;但是对第二个数据库的操作没有成功。这样数据的完整性就被破坏了。事务&#xff1a;是一组操作的集合&#xff0c;…

Android 之 ViewBinding 实现更安全、高效的视图绑定

​​一、配置说明​​​​作用位置​​需在模块级 build.gradle或 build.gradle.kts文件的 android {}块内添加&#xff1a;android {buildFeatures {viewBinding true // Kotlin DSL 语法} }android {buildFeatures {viewBinding true // Groovy 语法} }​​生成规则​​为每…

全球首款Java专用AI开发助手实测:一句话生成完整工程代码——飞算 JavaAI

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f;&#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d;&#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680;&#x1f340;欢迎使用&#xff1a;小智初学计算机…

Shader开发(七)创建第一个Shader项目

在前面的章节中&#xff0c;我们已经了解了Shader的基本概念和渲染管线的工作原理。现在&#xff0c;是时候动手实践了&#xff01;本章将带您一步步创建第一个Shader项目&#xff0c;开启真正的Shader开发之旅。 为什么选择openFrameworks&#xff1f; 与其他文章不同&#x…

IAR软件中测量函数执行时间

通常在调试代码中需要直到某个函数或者某段代码的实际执行时间&#xff0c;在IAR中可以直接借助软件提供的工具来计算代码执行时间。 第一种方法 进入仿真调试界面&#xff0c;在需要测量的代码前面打断点。工具栏中选择 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字节码文件(.class)的组成详解

文章目录基础信息常量池字段方法属性字节码文件内容说明案例文件基本信息类的基本信息常量池字段信息构造方法实例方法主方法源文件信息字节码文件由五部分组成&#xff0c;分别是基础信息、常量池、字段、方法、属性。案例&#xff1a; public class Main implements Interfa…

C++之vector类的代码及其逻辑详解 (下)

1. insert()这个就是在指定位置插入一个元素&#xff0c;首先计算要插入的这个位置和开头之间的距离&#xff0c;接着判断那个_finish 有没有碰到_endofstorage 或者_endofstorage 是不是为0&#xff0c;如果满足条件&#xff0c;那就进行扩容&#xff0c;然后接着重新计算距离…

【自动化测试】Python Selenium 自动化测试元素定位专业教程

1. 引言&#xff1a;元素定位在 Selenium 中的核心地位 元素定位是 Selenium 自动化测试的基础&#xff0c;所有用户交互操作&#xff08;如点击、输入、选择&#xff09;都依赖于准确识别页面元素。Selenium WebDriver 提供了多种定位策略&#xff0c;从简单的 ID 定位到复杂…