当前位置: 首页 > news >正文

界面优化 - QSS

目录

1、背景介绍

2、基本语法

3、QSS 设置方式

3.1 指定控件样式设置

代码示例: 子元素受到影响

3.2 全局样式设置

代码示例: 使用全局样式

代码示例: 样式的层叠特性

代码示例: 样式的优先级

3.3 从文件加载样式表

代码示例: 从文件加载全局样式

3.4 使用 Qt Designer 编辑样式

代码示例: 使用 Qt Designer 编辑样式

4、选择器

4.1 选择器概况

代码示例: 使用类型选择器选中子类控件

代码示例: 使用 id 选择器

代码示例: 使用并集选择器

4.2 子控件选择器 (Sub-Controls)

代码示例: 设置下拉框的下拉按钮样式

4.3 伪类选择器 (Pseudo-States)

 代码示例: 设置按钮的伪类样式.


1、背景介绍

在网页前端开发领域中, CSS 是一个至关重要的部分. 描述了一个网页的 "样式". 从而起到对网页美化的作用.

  • 所谓样式, 包括不限于大小, 位置, 颜色, 背景, 间距, 字体等等.

现在的网页很难找到没有 CSS 的. 可以说让 "界面好看" 是⼀个刚需.

一个程序的界面是否好看,是否重要呢?

  • 有些面向专业领域的程序,界面好看与否,不是很关键,更关键的是实际的效果。
  • 有些面向普通用户领域的程序,界面好看还是很大的加分项。

网页开发作为 GUI 的典型代表, 也对于其他客户端 GUI 开发产生了影响. Qt 也是其中之一.

Qt 仿照 CSS 的模式, 引入了 QSS, 来对 Qt 中的控件做出样式上的设定, 从而允许程序猿写出界面更好看的代码.

  • 同样受到 HTML 的影响, Qt 还引入了 QML 来描述界面, 甚至还可以直接把一个原生的 html 页面加载到界面上.

注意:

  • 如果通过 QSS 设置的样式和通过 C++ 代码设置的样式冲突, 则 QSS 优先级更高.

2、基本语法

对于 CSS 来说, 基本的语法结构非常简单.

选择器 {属性名: 属性值;
}

QSS 沿用了这样的设定.

选择器 {属性名: 属性值;
}

其中:

  • 选择器 描述了 "哪个 widget 要应用样式规则"。
  • 属性 则是一个键值对, 属性名表示要设置哪种样式, 属性值表示了设置的样式的值。

例如:

QPushButton { color: red; }

 或者:

QPushButton {color: red;
}

上述代码的含义表示, 针对界面上所有的 QPushButton , 都把文本颜色设置为 红色 .

  • 编写 QSS 时使用单行的格式和多行的格式均可.

代码示例: QSS 基本使用

1) 在界面上创建⼀个按钮.

2) 编写代码, 设置样式

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->pushButton->setStyleSheet("QPushButton { color : red;}");
}

3) 运行程序, 观察效果. 可以看到文本已经是红色了.

注意:

        上述代码中, 我们是只针对这一个按钮通过 setStyleSheet 方法设置的样式. 此时这个样式仅针对该按钮生效. 如果创建其他按钮, 其他按钮不会受到影响.

3、QSS 设置方式

3.1 指定控件样式设置

QWidget 中包含了 setStyleSheet 方法, 可以直接设置样式.

上述代码我们已经演示了上述设置方式.


另一方面, 给指定控件设置样式之后, 该控件的子元素也会受到影响.

代码示例: 子元素受到影响

1) 在界面上创建一个按钮

2) 修改 widget.cpp, 这次我们不再给按钮设置样式, 而是给 Widget 设置样式 (Widget 是 QPushButton 的父控件).

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 给 Widget 本身设置样式this->setStyleSheet("QPushButton { color : green;}");
}

3) 运行程序, 可以看到样式对于子控件按钮同样会生效.

3.2 全局样式设置

还可以通过 QApplication 的 setStyleSheet 方法设置整个程序的全局样式. 全局样式优点:

  • 使同一个样式针对多个控件生效, 代码更简洁.
  • 所有控件样式内聚在一起, 便于维护和问题排查.

代码示例: 使用全局样式

1) 在界面上创建三个按钮.

2) 编辑 main.cpp, 设置全局样式

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置全局样式a.setStyleSheet("QPushButton{ color : red; }");Widget w;w.show();return a.exec();
}

3) 运行程序, 可以看到此时三个按钮的颜色都设置为红色了.


代码示例: 样式的层叠特性

  • 如果通过全局样式给某个控件设置了属性1, 通过指定控件样式给控件设置属性2, 那么这两个属性都会产生作用.

1) 在界面上创建两个按钮

2) 编写 main.cpp, 设置全局样式, 把按钮文本设置为红色.

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置全局样式a.setStyleSheet("QPushButton{ color : red; }");Widget w;w.show();return a.exec();
}

3) 编写 widget.cpp, 给第一个按钮设置字体大小.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设定指定控件样式ui->pushButton->setStyleSheet("QPushButton{ font-size : 60px; }");
}

4) 运行程序, 可以看到, 对于第一个按钮来说, 同时具备了颜色和字体大小样式. 而第二个按钮只有颜色样式.

  • 说明针对第一个按钮, 两种设置方式设置的样式, 叠加起来了.

  1. 形如上述这种属性叠加的效果, 我们称为 "层叠性".

  2. CSS 全称为 Cascading Style Sheets, 其中 Cascading 就是 "层叠性" 的意思. QSS 也继承了这样的设定.
  3. 实际上把 QSS 叫做 QCSS 也许更合适⼀些~


代码示例: 样式的优先级

  • 如果全局样式, 和指定控件样式冲突, 则指定控件样式优先展示.

1) 在界面上创建两个按钮

2) 编辑 main.cpp, 把全局样式设置为红色.

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置全局样式a.setStyleSheet("QPushButton{ color : red; }");Widget w;w.show();return a.exec();
}

3) 编辑 widget.cpp, 把第一个按钮样式设为绿色.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设定指定控件样式ui->pushButton->setStyleSheet("QPushButton{ color : green; }");
}

4) 运行程序, 观察效果. 可以看到第一个按钮已经成为绿色了, 但是第二个按钮仍然是红色。

        在 CSS 中也存在类似的优先级规则. 通常来说都是 "局部" 优先级高于 "全局" 优先级. 相当于全局样式先 "奠定基调" , 再通过指定控件样式来 "特事特办" .

3.3 从文件加载样式表

  • 上述代码都是把样式通过硬编码的方式设置的. 这样使 QSS 代码和 C++ 代码耦合在一起了, 并不方便代码的维护.
  • 因此更好的做法是把样式放到单独的文件中, 然后通过读取文件的方式来加载样式.

代码示例: 从文件加载全局样式

1) 在界面上创建一个按钮

2) 创建 resource.qrc 文件, 并设定前缀为 / .

3) 创建 style.qss 文件, 并添加到 resource.qrc 中.

  • style.qss 是需要程序运行时加载的. 为了规避绝对路径的问题, 仍然使用 qrc 的方式来组织. (即把资源文件内容打包到 cpp 代码中).
  • Qt Creator 没有提供创建 qss 文件的选项. 咱们直接 右键 -> 新建文件 -> 手动设置文件扩展名为 qss 即可.

4) 使用 Qt Creator 打开 style.qss , 编写内容

QPushButton {color : red;
}

5) 修改 main.cpp, 新增一个函数用来加载样式

QString loadQss(){QFile file(":/style.qss");// 打开文件file.open(QFile::ReadOnly);// 读取文件内容,虽然 readAll 返回的是 QByteArray, 但是 QString 提供了QByteArray 版本的构造函数QString style = file.readAll();// 关闭文件file.close();return style;
}

6) 修改 main.cpp, 在 main 函数中调用上述函数, 并设置样式.

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 调用上述函数加载样式a.setStyleSheet(loadQss());Widget w;w.show();return a.exec();
}

7) 运行程序, 可以看到样式已经生效了.

3.4 使用 Qt Designer 编辑样式

        QSS 也可以通过 Qt Designer 直接编辑, 从而起到实时预览的效果. 同时也能避免 C++ 和 QSS 代码的耦合.

代码示例: 使用 Qt Designer 编辑样式

1) 在界面上创建⼀个按钮

2) 右键按钮, 选择 "改变样式表"

3) 在弹出的样式表编辑器中, 可以直接填写样式. 填写完毕, 点击 OK 即可.

4) 此时 Qt Designer 的预览界面就会实时显示出样式的变化.

5) 运行程序, 可以看到样式确实发生了改变.


这种方式设置样式, 样式内容会被以 xml 格式记录到 ui 文件中.

<property name="styleSheet">
<string notr="true">QPushButton { color : blue; }</string>
</property>

同时在控件的 styleSheet 属性中也会体现.

当我们发现一个控件的样式不符合预期的时候, 要记得排查这四个地方:

  • 全局样式
  • 指定控件样式
  • qss 文件中的样式
  • ui 文件中的样式

4、选择器

4.1 选择器概况

QSS 的选择器支持以下几种:

选择器示例说明
全局选择器*选择所有的 widget.
类型选择器 (type selector)QPushButton选择所有的 QPushButton 和 其子类 的控件.
类选择器 (class selector).QPushButton选择所有的 QPushButton 的控件. 不会选择子类.
ID 选择器#pushButton_2选择 objectName 为 pushButton_2 的控件.
后代选择器QDialog QPushButton选择 QDialog 的所有后代(子控件, 孙子控件等等) 中的 QPushButton.
子选择器QDialog > QPushButton选择 QDialog 的所有子控件中的 QPushButton.
并集选择器QPushButton, QLineEdit, QComboBox选择 QPushButton, QLineEdit, QComboBox 这三种控件. (即接下来的样式会针对这三种控件都生效).
属性选择器QPushButton[flat="false"]选择所有 QPushButton 中, flat 属性为 false 的控件.

代码示例: 使用类型选择器选中子类控件

1) 在界面上创建一个按钮.

2) 修改 main.cpp, 设置全局样式

  • 注意, 此处选择器使用的是 QWidget . QPushButton 也是 QWidget 的子类, 所以会受到 QWidget 选择器的影响.
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置全局样式a.setStyleSheet("QWidget { color : red; }");Widget w;w.show();return a.exec();
}

 3) 运行程序, 可以看到按钮的文本颜色已经是红色了.

5) 如果把上述样式代码修改为下列代码

// 设置全局样式
a.setStyleSheet(".QWidget { color : red; }");

此时按钮的颜色不会发生改变. 此时只是选择 QWidget 类, 而不会选择 QWidget 的子类 QPushButton 了.


代码示例: 使用 id 选择器

1) 在界面上创建 3 个按钮, objectName 为 pushButton , pushButton_2 , pushButton_3

2) 编写 main.cpp, 设置全局样式

  • 先通过 QPushButton 设置所有的按钮为黄色.
  • 再通过 #pushButton 和 #pushButton_2 分别设置这两个按钮为红色和绿色.
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置全局样式QString style = "";style += "QPushButton { color : yellow; }";style += "#pushButton_2 { color : red; }";style += "#pushButton_3 { color : green; }";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

 3) 执行程序, 观察效果

  • 当某个控件身上, 通过类型选择器和 ID 选择器设置了冲突的样式时, ID 选择器样式优先级更高.
  • 同理, 如果是其他的多种选择器作用同一个控件时出现冲突的样式, 也会涉及到优先级问题. Qt 文档上有具体的优先级规则介绍 (参见 The Style Sheet Syntax 的 Conflict Resolution 章节).
  • 实践中我们可以简单的认为, 选择器描述的范围越精准, 则优先级越高. 一般来说, ID 选择器优先级是最高的.

代码示例: 使用并集选择器

1) 创建按钮, label, 单行输入框

2) 编写 main.cpp, 设置全局样式

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 设置全局样式a.setStyleSheet("QPushButton, QLabel, QLineEdit { color : red; }");Widget w;w.show();return a.exec();
}

3) 运行程序, 可以看到这三种控件的文字颜色都设置为了红色

        并集选择器是⼀种很好的代码复用的方式. 很多时候我们希望界面上的多个元素风格是统⼀的, 就可以使用并集选择器, 把样式属性同时指定给多种控件.

4.2 子控件选择器 (Sub-Controls)

有些控件内部包含了多个 "子控件" . 比如 QComboBox 的下拉后的面板, 比如 QSpinBox 的上下按钮等.

可以通过子控件选择器 :: , 针对上述子控件进行样式设置.

🌴哪些控件拥有哪些子控件, 参考文档 Qt Style Sheets ReferenceList of Sub-Controls 章节.


代码示例: 设置下拉框的下拉按钮样式

1) 在界面上创建⼀个下拉框, 并创建几个选项

2) 创建 resource.qrc , 并导入图片 down.png

3) 修改 main.cpp, 编写全局样式

  • 使用子控件选择器 QComboBox::down-arrow 选中了 QComboBox 的下拉按钮.
  • 再通过 image 属性设置图片.
int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style = "";style += "QComboBox::down-arrow { image: url(:/down.png) }";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

 4) 执行程序, 观察效果

4.3 伪类选择器 (Pseudo-States)

伪类选择器, 是根据控件所处的某个状态被选择的. 例如按钮被按下, 输入框获取到焦点, 鼠标移动到某个控件上等.

  • 当状态具备时, 控件被选中, 样式生效.
  • 当状态不具备时, 控件不被选中, 样式失效.

使用 : 的方式定义伪类选择器.

常用的伪类选择器:

伪类选择器说明
:hover鼠标放到控件上
:pressed鼠标左键按下时
:focus获取输入焦点时
:enabled元素处于可用状态时
:checked被勾选时
:read-only元素为只读状态时

这些状态可以使用 ! 来取反. 比如 :!hover 就是鼠标离开控件时, :!pressed 就是鼠标松开时, 等等.

更多伪类选择器的详细情况, 参考 Qt Style Sheets ReferencePseudo-States 章节.


 代码示例: 设置按钮的伪类样式.

1) 在界面上创建⼀个按钮

2) 编写 main.cpp, 创建全局样式

int main(int argc, char *argv[])
{QApplication a(argc, argv);QString style = "QPushButton { color : red; }";style += "QPushButton:hover { color : green; }";style += "QPushButton:pressed { color : blue; }";a.setStyleSheet(style);Widget w;w.show();return a.exec();
}

3) 运行程序, 可以看到, 默认情况下按钮文字是红色, 鼠标移动上去是绿色, 鼠标按下按钮是蓝色.

相关文章:

界面优化 - QSS

目录 1、背景介绍 2、基本语法 3、QSS 设置方式 3.1 指定控件样式设置 代码示例: 子元素受到影响 3.2 全局样式设置 代码示例: 使用全局样式 代码示例: 样式的层叠特性 代码示例: 样式的优先级 3.3 从文件加载样式表 代码示例: 从文件加载全局样式 3.4 使用 Qt Desi…...

实现基于TCP协议的服务器与客户机间简单通信

服务器端程序 #include <myhead.h> #define SER_PORT 6666 //服务器端口号 #define SER_IP "192.168.2.53" //服务器ip地址 int main(int argc, char const *argv[]) { /*创建套接字 int socket(int domain, int type, int protocol);*/ …...

在uniapp中使用navigator.MediaDevices.getUserMedia()拍照并上传服务器

产品提了这样一个需求&#xff1a; 移动端拍照上传后图片不保存在用户设备上&#xff0c;试了好几种方法&#xff0c;uni-file-picker、uni.chooseImage、input type‘file’&#xff0c;安卓手机都会默认把图片保存在手机&#xff0c;于是各种查资料&#xff0c;找到了以下方法…...

PULLUP

重要提示&#xff1a;PULLUP属性已被弃用&#xff0c;应替换为PULLTYPE 财产。 PULLUP在三态输出或双向端口上应用弱逻辑高&#xff0c;以防止 它从漂浮。PULLUP属性保证逻辑高电平&#xff0c;以允许三态网络 以避免在不被驱动时漂浮。 输入缓冲器&#xff08;如IBUF&#xff…...

【无标题】乐天HIQ壁挂炉使用

这里写自定义目录标题 1.按键①&#xff1a; 按一下&#xff0c;小液晶显示的温度是所设定的供暖温度&#xff1b; 按二下&#xff0c;小液晶显示的温度是所设定的生活热水温度&#xff1b; 按三下&#xff0c;小液晶显示的温度是所设定的室内温度&#xff1b; 如果忘记按几下的…...

使用Python编写AI程序,让机器变得更智能

人工智能&#xff08;AI&#xff09;是当今科技领域最热门的话题之一。随着Python编程语言的逐渐流行&#xff0c;它已经成为许多人工智能编程的首选语言。本文将介绍如何使用Python编写AI程序&#xff0c;让机器变得更智能。 首先&#xff0c;Python提供了大量的AI库和工具&a…...

VScode + PlatformIO 和 Keil 开发 STM32

以前经常使用 KEIL 写 STM32 的代码&#xff0c;自从使用 VScode 写 ESP32 后感觉 KEIL 的开发环境不美观不智能了&#xff0c;后面学习了 VScode 开发 STM32 。 使用过程中发现 串口重定向在 KEIL 中可以用&#xff0c;搬到 VScode 后不能用&#xff0c;不用勾选 Use Micro LI…...

PostgreSQL 练习 ---- psql 新增连接参数

目标 添加一个连接参数&#xff0c;默认为 false 。当 psql 连接时&#xff0c;若该连接参数非 “true” 时&#xff0c;用户 “u1“ 对表对象无操作权限&#xff0c;包括自己拥有的表。 连接机制简介 连接过程如下所述&#xff1a; 客户端初始化一个空连接&#xff0c;设置…...

pdf翻译软件哪个好用?多语言轻松转

想知道怎么用pdf翻译器在线翻译吗&#xff1f;无需复杂操作&#xff0c;一键即可解锁语言障碍。 在这个全球化日益加深的时代&#xff0c;掌握pdf文件的快速翻译技巧尤为重要。 无论是学习、工作还是国际交流&#xff0c;以下4个免费pdf翻译技巧都将是你不可或缺的得力助手。…...

培训第三十天(ansible模块的使用)

上午 ansible是⼀种由Python开发的⾃动化运维⼯具&#xff0c;集合了众多运维⼯ 具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量 系统配置、批量程序部署、批量运⾏命令等功能。 1、学习ansible的使用 ansible 主机ip|域名|组…...

关于Log4net的使用记录——无法生成日志文件输出

关于Log4net的使用记录 前言遇到的问题具体使用总结前言 最近在使用log4net进行日志记录,保存一些需要的数据,以便后期使用需要。在使用的时候出现没有生成日志文件,针对这些问题,发现解决的办法! 遇到的问题 报错,提示没有找到对应的文件。 log4net:ERROR Failed to f…...

golang Kratos 概念

"Kratos"指的是一个开源的微服务框架&#xff0c;它用于构建高性能和可扩展的云原生应用。Kratos框架提供了一套丰富的工具和库&#xff0c;旨在简化微服务的开发和维护。下面是Kratos框架的一些基本概念&#xff1a; 服务构建与注册&#xff1a; gRPC与HTTP服务&…...

入门 MySQL 数据库:基础指南

简介 MySQL 是一个非常流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于 Web 应用、企业应用和数据仓库。本博客将引导你从零开始&#xff0c;学习 MySQL 数据库的基础知识。 什么是 MySQL&#xff1f; MySQL 是一个基于 SQL&#xff08;Str…...

【Hexo系列】【3】使用GitHub自带的自定义域名解析

上一期我们通过学习【Hexo系列】【2】使用Vercel加速Hexo博客访问使用Vercel进行GitHub同步与加速&#xff0c;有时候Vercel也不太稳定访问不了。本身GitHub也是支持自定义域名的&#xff0c;本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitH…...

智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航

随着科技的飞速发展&#xff0c;药品仓库的安全管理正迎来前所未有的变革。药品作为直接关系到公众健康的重要物资&#xff0c;其安全存储和监管显得尤为重要。在这个背景下&#xff0c;视频汇聚平台EasyCVR视频智能管理系统的应用&#xff0c;为药品仓库的安全监管提供了强有力…...

本地创建PyPI镜像

背景: 在安装一些库时,经常需要反复下载包(有的体积比较大,所以会比较慢),所以考虑在本地创建一个pypi镜像,把常用的库缓存下来,这样安装就会很省事.比较从本地安装库和从服务器下载会快很多. 安装使用 安装:pip install devpi 初始化: devpi-init --serverdirF:\pypioutput…...

使用 Elasticsearch RestHighLevelClient 进行查询

Elasticsearch 提供了多种客户端库&#xff0c;以方便不同编程语言的用户进行操作。其中&#xff0c;Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一&#xff0c;用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…...

【jvm】符号引用

目录 1. 说明2. 特点3. 组成与格式4. 作用5. 过程 1. 说明 1.在Java虚拟机中&#xff0c;符号引用&#xff08;Symbolic Reference&#xff09;是一种重要的引用机制。2.它主要用于在编译阶段和类加载阶段之间建立对类、方法、字段等元素的引用关系。3.符号引用是指用一个符号…...

征服云端:Java微服务与Docker容器化之旅

引言 随着云计算技术的迅猛发展&#xff0c;越来越多的企业开始拥抱云原生技术。在这个过程中&#xff0c;微服务架构以其独特的魅力成为了众多开发者的首选方案。而Docker作为容器化领域的佼佼者&#xff0c;在微服务部署与管理方面扮演着不可或缺的角色。本文将带你深入了解…...

python 如何实现执行selenium自动化测试用例自动录屏?

做自动化测试已经好多年了&#xff0c;随着项目技术的正增长提升&#xff0c;我们也不断完善并提高自己的技术能力&#xff0c; 下面给大家分享一个 selenium 自动化执行测试用例的录屏功能。希望对大家有帮助&#xff01; 首先&#xff0c;我们为什么要执行自动化录屏功能呢…...

03 网络编程 TCP传输控制协议

目录 1、TCP基本特征 2、TCP通信流程基本原理 &#xff08;1&#xff09;基本原理 &#xff08;2&#xff09;TCP通信代码实现 &#xff08;3&#xff09;核心API解析 1&#xff09;地址绑定--bind 2)设置监听-listen 3)等待连接请求-accept-产生一个已连接套接字 4&a…...

1. 数据结构——顺序表的主要操作

1. 内容 顺序表的初始化、插入、删除、按值查找、输出以及其时间复杂度的计算。 2.代码 #include<stdio.h> #include<stdlib.h> //函数结果状态代码 #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define MAXSIZE 100typedef int ElemType; //顺序表每个…...

[openSSL]TLS 1.3握手分析

文章目录 前言一、ECDHE密钥交换二、TLS单向身份认证三、TLS双向身份认证 前言 关于TLS握手网上资料很多&#xff0c;但是有一些写的很不清楚&#xff0c;导致学习时对概念和流程出现混淆&#xff0c;以下是我觉得写得比较清晰和准确的供学习参考。 浅析 TLS&#xff08;ECDHE…...

无人机之螺旋桨的安装与维护

一、安装&#xff1a;正确安装桨叶至关重要。请确保顺时针旋转的桨叶安装在对应的电机上&#xff0c;并使逆时针旋转的桨叶安装在相应的电机上。否则&#xff0c;无人机可能无法正常飞行或失去控制。 二、维护&#xff1a;为了确保无人机的安全及长久使用&#xff0c;请定期检…...

手机设备IP地址切换:方法、应用与注意事项

在当今数字化时代&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;手机都扮演着重要角色。然而&#xff0c;随着网络环境的日益复杂&#xff0c;有时我们需要切换手机设备的IP地址以满足特定的需求&#xff0c;如保护隐私、绕过地…...

华为HCIP证书好考吗?详解HCIP证书考试难易程度及备考策略!

华为认证体系主要分为三个层次&#xff1a;HCIA(Huawei Certified ICT Associate)&#xff0c;HCIP(Huawei Certified ICT Professional)和HCIE(Huawei Certified Internetwork Expert)。作为中级认证&#xff0c;HCIP证书主要面向具备一定技术基础和项目实践能力的专业人士。在…...

《SPSS零基础入门教程》学习笔记——05.模型入门

文章目录 5.1 回归模型5.2 分类模型5.3 降维和刻度模型5.4 生存分析和时间序列模型 5.1 回归模型 线性回归&#xff08;分析 -> 回归 -> 线性&#xff09;曲线估计&#xff08;分析 -> 回归 -> 曲线估计&#xff09; 二元Logistic回归&#xff08;分析 -> 回归…...

如何用不到一分钟的时间将Excel电子表格转换为应用程序

我们大多数人对电子表格又爱又恨。当企业需要分析数据、为决策过程提供信息并可视化信息时&#xff0c;Excel和Google Sheets是首选。这些文档非常容易创建&#xff0c;它们帮助我们以直接的方式构建相关的想法和适用的数据。除此之外&#xff0c;事情可能会变得一团糟。 对于…...

WordPress 中 cURL 请求出现 504 网关超时错误的解决方法

错误原因 504网关超时错误通常发生在服务器作为网关或代理&#xff0c;不能在规定的时间内得到响应时。在WordPress中&#xff0c;这可能是因为目标服务器响应过慢&#xff0c;或请求的队列过长导致的。 解决方案 首先&#xff0c;您应该检查您的cURL请求是否设置了一个合理的…...

事件和委托的区别

在C#中&#xff0c;事件&#xff08;Event&#xff09;和委托&#xff08;Delegate&#xff09;是紧密相关但具有不同含义的概念。以下是它们的主要区别&#xff1a; 委托&#xff08;Delegate&#xff09;: 委托是一种类型&#xff0c;它表示一个方法的签名&#xff08;即方法…...

低功耗蓝牙协议栈如何学习?

目录 1. 基础知识 1.1 了解BLE基本概念 1.2 阅读BLE规范 2. 实践和开发工具 2.1 使用开发板 2.2 安装开发环境 3. 学习资源 3.1 官方文档和示例 3.2 在线课程和教程 4. 实践项目 4.1 简单项目 4.2 复杂项目 5. 深入理解协议栈 5.1 分析协议栈 5.2 调试和分析 6…...

ROS 2中,CMakeList.txt常见语法

在ROS 2中&#xff0c;CMakeList.txt 文件扮演着配置和管理构建过程的重要角色。这个文件遵循CMake的语法&#xff0c;用于定义如何编译和链接源代码。下面是一些在ROS 2项目CMakeList.txt文件中常见的语法和用法。 1. 基本结构和命令 cmake_minimum_required(VERSION )&…...

使用 prefetchComponents 进行组件预取

title: 使用 prefetchComponents 进行组件预取 date: 2024/8/17 updated: 2024/8/17 author: cmdragon excerpt: 摘要&#xff1a;本文介绍Nuxt.js中的prefetchComponents功能&#xff0c;用于预取组件以提高用户体验。通过在客户端后台下载和缓存组件&#xff0c;确保在用户…...

『 C++ 』IO流

文章目录 IO流概述iostream 的标准对象C流和C标准库I/O函数的同步 sync_with_stdiofstream 文件流文件流的打开标志二进制读写二进制读写的浅拷贝问题文本读写 字符串流注意 IO流概述 流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以…...

enhanced Input Action IA_Look中Action value引脚没有分割结构体引脚的选项

UE5系列文章目录 文章目录 UE5系列文章目录前言二、使用步骤解决办法 前言 据说&#xff0c;unreal engine5中准备废弃“项目设置”中“输入”&#xff0c;操作映射&#xff0c;轴映射。取而代之的是&#xff1a; 使用增强的输入动作&#xff08;Enhanced Input Actions&#…...

C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP

一、NetworkStream 什么是NetworkStream&#xff1f; NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间&#xff0c;并提供了通过网络连接进行读写操作的功能。NetworkStream 主要用于处理从网络套接字&#xff08;Soc…...

大模型--学习范式

1. 自监督学习&#xff08;Self-Supervised Learning&#xff09; 概念&#xff1a;自监督学习是一种特殊形式的监督学习&#xff0c;其中标签不是由人工标注的&#xff0c;而是从输入数据本身自动生成的。模型利用这些自动生成的标签进行训练。自监督学习通常用于预训练阶段&…...

Hadoop-yarn-unauthorized 未授权访问漏洞

一、漏洞描述&#xff1a; Hadoop是一款由Apache基金会推出的分布式系统框架&#xff0c;它通过著名的 MapReduce 算法进行分布式处理&#xff0c;Yarn是Hadoop集群的资源管理系统。YARN提供有默认开放在8088和8090的REST API&#xff08;默认前者&#xff09;允许用户直接通过…...

工作流调度系统(DolphinScheduler、Azkaban、Airflow、Oozie 和 XXL-JOB)

文章目录 1. DolphinScheduler1.1 DolphinScheduler介绍1.2 DolphinScheduler优点 2. Azkaban2.1 Azkaban介绍2.2 Azkaban优点 3. Airflow3.1 Airflow介绍3.1 Airflow优点 4. Oozie4.1 Oozie 介绍4.2 Oozie 优点 5. XXL-JOB5.1 XXL-JOB介绍5.2 XXL-JOB优点 6. 总结 1. DolphinS…...

PyTorch 基础学习(5)- 神经网络

系列文章&#xff1a; PyTorch 基础学习&#xff08;1&#xff09; - 快速入门 PyTorch 基础学习&#xff08;2&#xff09;- 张量 Tensors PyTorch 基础学习&#xff08;3&#xff09; - 张量的数学操作 PyTorch 基础学习&#xff08;4&#xff09;- 张量的类型 PyTorch 基础学…...

CI/CD 自动化:最大限度地提高极狐GitLab 群组的“部署冻结”影响

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

单元训练10:定时器实现秒表功能-数组方式

蓝桥杯 小蜜蜂 单元训练10&#xff1a;定时器实现秒表功能-数组方式 /** Description:* Author: fdzhang* Email: zfdcqq.com* Date: 2024-08-15 21:58:53* LastEditTime: 2024-08-16 19:07:27* LastEditors: fdzhang*/#include "stc15f2k60s2.h"#define LED(x) …...

国外项目管理软件最佳实践:选型与应用

国内外主流的10款国外项目管理软件对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时&#xff0c;你是否感到不知从何选择&#xff1f;市场上琳琅满目的选项往往令人眼花缭乱&…...

Angular组件概念

Angular 是一个由 Google 维护的开源前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和移动Web应用。Angular 应用由多个组件&#xff08;Components&#xff09;组成&#xff0c;这些组件是 Angular 应用构建块的基本单位。 1. Angular 组件的基本概念 …...

嵌入式人工智能ESP32(4-PWM呼吸灯)

1、PWM基本原理 PWM&#xff08;Pulse-width modulation&#xff09;是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则&#xff0c;…...

继承 (上)【C++】

文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么&#xff1f;继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象&#xff0c;但是父类对象不能直接赋值给…...

WPF打印控件内容

当我们想打印控件内容时&#xff0c;如一个Grid中的内容&#xff0c;可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下&#xff1a; XAML代码如下 <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width"300"…...

[C++][opencv]基于opencv实现photoshop算法图像剪切

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数&#xff1a;src为源图像&#xff0c; dst为结果图像, rect为剪切区域 //返回值&#xff1a;返回0表示成功&#xff0c;否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…...

四十、大数据技术之Kafka3.x(3)

&#x1f33b;&#x1f33b; 目录 一、Kafka Broker1.1 Kafka Broker工作流程1.1.1 Zookeeper 存储的Kafka信息1.1.2 Kafka Broker 总体工作流程1.1.3 Broker 重要参数 1.2 生产经验——节点服役和退役1.2.1 服役新节点1.2.2 退役旧节点 1.3 Kafka 副本1.3.1 副本基本信息1.3.2…...

redis——基本命令

什么是Reids&#xff08;REmote Dictionary Server&#xff09; Redis是现在主流的数据库之一&#xff0c;是一个使用ANSI C编写的开源、包含多种数据结构、支持网络的、基于内存、可选持久性的键值对存储数据。 特性 1.速度快 &#xff1a;Redis的数据全部存储瑜内存中。 …...