QT基础七、用纯代码编写界面

终于迎来了界面开发的实战环节!今天我们将通过纯代码的方式,亲手打造一个界面。如果你对 Qt 感兴趣,欢迎订阅我的 Qt 基础入门专栏 (完全免费哦)。虽然前面几篇文章主要是基础知识讲解,可能会显得稍微平淡,但它们是迈向实战的重要基石。而今天,我们将迎来一次小型的代码实战——用代码实现一个如下图所示的完整界面!

这不仅是一次实践的机会,更是一个让你快速掌握 Qt 界面开发技巧的绝佳起点。让我们一起动手,感受代码的魅力吧!


一、思路

1、分析一下界面构成

这个界面由四种主要组件构成:复选框(用于选择字体样式)、单选框(用于设置字体颜色)、文本编辑框以及三个操作按钮。为了使布局更加清晰和有序,我们可以采用三个水平布局来分别管理这些组件:

  • 第一个水平布局负责排列复选框(字体样式)。
  • 第二个水平布局用于组织单选框(字体颜色)。
  • 第三个水平布局则用来放置三个操作按钮。注意一下,关闭按钮在许多软件中都是将其放在最右边,所以,在添加关闭按钮前,需要添加一个可拉伸的组件,代码中会有,请注意一下。

接着,我们将这三组水平布局与单独的文本编辑框依次添加到一个垂直布局中。通过这种方式,整个界面结构层次分明、整洁美观,所有组件都能在一个统一的垂直布局中井然有序地呈现出来。

2、步骤分析
  1. 界面设计

    • 使用复选框控制字体样式(下划线、斜体、粗体)。
    • 使用单选按钮控制文字颜色(黑色、红色、绿色)。
    • 使用文本编辑框显示效果。
    • 使用按钮(确认、取消、关闭)提供基本操作。
  2. 信号与槽机制

    • 通过信号与槽机制,将用户操作(如点击复选框、单选按钮)与具体的槽函数关联起来,动态更新文本编辑框的样式。
  3. 布局管理

    • 使用水平布局和垂直布局合理组织控件,确保界面整洁美观。
  4. 内存管理

    • 所有控件都设置了父对象,Qt 的父子机制会自动管理内存,避免手动释放资源。

二、创建一个QDialog项目

这次选用的基类跟前面几期的基类不一样,这次用的是QDialog(如果不会创建,请看我第一期),如下图所示:


三、初始化组件

1、用指针初始化变量的原因:
  1. 动态内存分配 :确保控件的生命周期足够长。
  2. 父子机制 :支持 Qt 的自动内存管理。
  3. 灵活性 :允许动态创建、共享和传递对象。
  4. 节省内存 :避免不必要的对象复制。
  5. 设计哲学 :符合 Qt 的设计理念,特别是信号与槽机制。
2、dialog.h的代码 
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QHBoxLayout>          //水平布局
#include <QVBoxLayout>          //垂直布局class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private:void initUI();        //初始化组件的函数private://下划线、斜体、粗体的组件QCheckBox* chkBoxUnderLine;QCheckBox* chkBoxItalic;QCheckBox* chkBoxBold;//黑色、红色、绿色的组件QRadioButton* rBtnBlack;QRadioButton* rBtnRed;QRadioButton* rBtnGreen;//文本编辑器的组件QPlainTextEdit* txtEdit;//确定、取消、退出的组件QPushButton* btnOk;QPushButton* btnCancel;QPushButton* btnClose;//水平布局编辑器QHBoxLayout* hLayout1;QHBoxLayout* hLayout2;QHBoxLayout* hLayout3;//垂直布局编辑器QVBoxLayout* vLayout;
};
#endif // DIALOG_H
3、void initUI()的代码
void Dialog::initUI()
{// 创建字体相关的复选框chkBoxUnderLine = new QCheckBox("下划线");  // 下划线复选框chkBoxItalic = new QCheckBox("斜体");       // 斜体复选框chkBoxBold = new QCheckBox("粗体");         // 粗体复选框// 创建水平布局1,并将字体相关的复选框添加到该布局中hLayout1 = new QHBoxLayout;                 // 创建水平布局1hLayout1->addWidget(chkBoxUnderLine);       // 将下划线复选框添加到水平布局1hLayout1->addWidget(chkBoxItalic);          // 将斜体复选框添加到水平布局1hLayout1->addWidget(chkBoxBold);            // 将粗体复选框添加到水平布局1// 创建颜色相关的单选按钮rBtnBlack = new QRadioButton("黑色");       // 黑色单选按钮rBtnBlack->setChecked(true);                //默认黑色单选已选上rBtnRed = new QRadioButton("红色");         // 红色单选按钮rBtnGreen = new QRadioButton("绿色");       // 绿色单选按钮// 创建水平布局2,并将颜色相关的单选按钮添加到该布局中hLayout2 = new QHBoxLayout;                 // 创建水平布局2hLayout2->addWidget(rBtnBlack);             // 将黑色单选按钮添加到水平布局2hLayout2->addWidget(rBtnRed);               // 将红色单选按钮添加到水平布局2hLayout2->addWidget(rBtnGreen);             // 将绿色单选按钮添加到水平布局2// 创建一个多行文本编辑框,用于显示或输入文本txtEdit = new QPlainTextEdit;               // 创建一个纯文本编辑框//将文本编辑框的字体大小调大auto font = txtEdit->font();font.setPointSize(20);txtEdit->setFont(font);// 创建操作按钮btnOk = new QPushButton("确认");            // 确认按钮btnCancel = new QPushButton("取消");        // 取消按钮btnClose = new QPushButton("关闭");         // 关闭按钮hLayout3 = new QHBoxLayout;                 // 创建水平布局3hLayout3->addWidget(btnOk);                 // 将确认按钮添加到水平布局3hLayout3->addWidget(btnCancel);             // 将取消按钮添加到水平布局3hLayout3->addStretch();                     // 添加一个可拉伸的空间,使按钮靠左对齐hLayout3->addWidget(btnClose);              // 将关闭按钮添加到水平布局3vLayout = new QVBoxLayout;                  // 创建垂直布局vLayout->addLayout(hLayout1);               // 将水平布局1(字体复选框)添加到垂直布局vLayout->addLayout(hLayout2);               // 将水平布局2(颜色单选按钮)添加到垂直布局vLayout->addWidget(txtEdit);                // 将文本编辑框添加到垂直布局vLayout->addLayout(hLayout3);               // 将水平布局3(操作按钮)添加到垂直布局setLayout(vLayout);                         // 将垂直布局设置为当前窗口的布局
}

四、初始化信号和槽

在QT中,想要让按钮和选项框生效,那么就必须引入信号和槽,因为我们用了QT自带的组件,所以我们可以用QT中自带的信号,至于槽函数需要我们自己去编写

1、dialog.h的代码 
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QHBoxLayout>          //水平布局
#include <QVBoxLayout>          //垂直布局
#include <QMessageBox>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private:void initUI();void initSignalSlots();    //初始化信号和槽private slots://字体复选框槽函数void onChkBoxUnderLine(bool checked);void onChkBoxItalic(bool checked);void onChkBoxBold(bool checked);//颜色单选框槽函数void setTextFontColor();//确认的功能按钮void pushButtonOk();//取消的功能按钮void pushButtonCancel();private://下划线、斜体、粗体的组件QCheckBox* chkBoxUnderLine;QCheckBox* chkBoxItalic;QCheckBox* chkBoxBold;//黑色、红色、绿色的组件QRadioButton* rBtnBlack;QRadioButton* rBtnRed;QRadioButton* rBtnGreen;//文本编辑器的组件QPlainTextEdit* txtEdit;//确定、取消、退出的组件QPushButton* btnOk;QPushButton* btnCancel;QPushButton* btnClose;//水平布局编辑器QHBoxLayout* hLayout1;QHBoxLayout* hLayout2;QHBoxLayout* hLayout3;//垂直布局编辑器QVBoxLayout* vLayout;
};
#endif // DIALOG_H

更新的部分 

 2、void initSignalSlots()的代码
void Dialog::initSignalSlots()
{//复选框connect(chkBoxUnderLine, SIGNAL(clicked(bool)),this, SLOT(onChkBoxUnderLine(bool)));connect(chkBoxItalic, SIGNAL(clicked(bool)),this, SLOT(onChkBoxItalic(bool)));connect(chkBoxBold, SIGNAL(clicked(bool)),this, SLOT(onChkBoxBold(bool)));//单选框connect(rBtnBlack, SIGNAL(clicked()), this, SLOT(setTextFontColor()));connect(rBtnRed, SIGNAL(clicked()), this, SLOT(setTextFontColor()));connect(rBtnGreen, SIGNAL(clicked()), this, SLOT(setTextFontColor()));//功能按钮connect(btnOk, SIGNAL(clicked()), this, SLOT(pushButtonOk()));connect(btnCancel, SIGNAL(clicked()), this, SLOT(pushButtonCancel()));connect(btnClose, SIGNAL(clicked()), this, SLOT(close()));
}
3、实现复选框的三个槽函数
// 当下划线复选框被点击时,该槽函数会被调用。
// 参数 clicked 表示复选框的当前状态(true 表示选中,false 表示未选中)。
void Dialog::onChkBoxUnderLine(bool clicked)
{// 获取文本编辑框当前的字体auto font = txtEdit->font();// 根据复选框的状态设置字体的下划线属性font.setUnderline(clicked);// 将修改后的字体重新设置回文本编辑框txtEdit->setFont(font);
}// 当斜体复选框被点击时,该槽函数会被调用。
void Dialog::onChkBoxItalic(bool clicked)
{// 获取文本编辑框当前的字体auto font = txtEdit->font();// 根据复选框的状态设置字体的斜体属性font.setItalic(clicked);// 将修改后的字体重新设置回文本编辑框txtEdit->setFont(font);
}// 当粗体复选框被点击时,该槽函数会被调用。
void Dialog::onChkBoxBold(bool clicked)
{// 获取文本编辑框当前的字体auto font = txtEdit->font();// 根据复选框的状态设置字体的粗体属性font.setBold(clicked);// 将修改后的字体重新设置回文本编辑框txtEdit->setFont(font);
}
4、实现单选框的槽函数
// 设置文本编辑框的文字颜色
void Dialog::setTextFontColor()
{// 获取文本编辑框的当前调色板auto palette = txtEdit->palette();// 检查黑色单选按钮是否被选中if (rBtnBlack->isChecked()) {// 如果黑色单选按钮被选中,将调色板中的文字颜色设置为黑色palette.setColor(QPalette::Text, Qt::black);} // 检查红色单选按钮是否被选中else if (rBtnRed->isChecked()) {// 如果红色单选按钮被选中,将调色板中的文字颜色设置为红色palette.setColor(QPalette::Text, Qt::red);} // 检查绿色单选按钮是否被选中else if (rBtnGreen->isChecked()) {// 如果绿色单选按钮被选中,将调色板中的文字颜色设置为绿色palette.setColor(QPalette::Text, Qt::green);}// 将修改后的调色板重新应用到文本编辑框txtEdit->setPalette(palette);
}
5、设计功能按钮的槽函数

可以自己设计要进行的内容,我的确认按钮是输出文本中每一行的头一个元素,取消按钮就是输出一个已取消,关闭按钮用了QT自带的 close() 函数

void Dialog::pushButtonOk()
{auto text = txtEdit->toPlainText();     //将文本转换为QStringauto strList = text.split("\n");QString ret;for(auto& str: strList) {ret += str[0];}QMessageBox::information(this, "提示", ret);
}void Dialog::pushButtonCancel()
{QMessageBox::information(this, "提示", "已取消");
}

五、运行代码

1、项目的所有代码

1. dialog.h: 

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QHBoxLayout>          //水平布局
#include <QVBoxLayout>          //垂直布局
#include <QMessageBox>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private:void initUI();void initSignalSlots();private slots://字体复选框槽函数void onChkBoxUnderLine(bool checked);void onChkBoxItalic(bool checked);void onChkBoxBold(bool checked);//颜色单选框槽函数void setTextFontColor();//确认的功能按钮void pushButtonOk();//取消的功能按钮void pushButtonCancel();private://下划线、斜体、粗体的组件QCheckBox* chkBoxUnderLine;QCheckBox* chkBoxItalic;QCheckBox* chkBoxBold;//黑色、红色、绿色的组件QRadioButton* rBtnBlack;QRadioButton* rBtnRed;QRadioButton* rBtnGreen;//文本编辑器的组件QPlainTextEdit* txtEdit;//确定、取消、退出的组件QPushButton* btnOk;QPushButton* btnCancel;QPushButton* btnClose;//水平布局编辑器QHBoxLayout* hLayout1;QHBoxLayout* hLayout2;QHBoxLayout* hLayout3;//垂直布局编辑器QVBoxLayout* vLayout;
};
#endif // DIALOG_H

2. dialog.cpp:

#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(800, 400);initUI();initSignalSlots();}Dialog::~Dialog()
{}void Dialog::initUI()
{// 创建字体相关的复选框chkBoxUnderLine = new QCheckBox("下划线");  // 下划线复选框chkBoxItalic = new QCheckBox("斜体");       // 斜体复选框chkBoxBold = new QCheckBox("粗体");         // 粗体复选框// 创建水平布局1,并将字体相关的复选框添加到该布局中hLayout1 = new QHBoxLayout;                 // 创建水平布局1hLayout1->addWidget(chkBoxUnderLine);       // 将下划线复选框添加到水平布局1hLayout1->addWidget(chkBoxItalic);          // 将斜体复选框添加到水平布局1hLayout1->addWidget(chkBoxBold);            // 将粗体复选框添加到水平布局1// 创建颜色相关的单选按钮rBtnBlack = new QRadioButton("黑色");       // 黑色单选按钮rBtnBlack->setChecked(true);                //默认黑色单选已选上rBtnRed = new QRadioButton("红色");         // 红色单选按钮rBtnGreen = new QRadioButton("绿色");       // 绿色单选按钮// 创建水平布局2,并将颜色相关的单选按钮添加到该布局中hLayout2 = new QHBoxLayout;                 // 创建水平布局2hLayout2->addWidget(rBtnBlack);             // 将黑色单选按钮添加到水平布局2hLayout2->addWidget(rBtnRed);               // 将红色单选按钮添加到水平布局2hLayout2->addWidget(rBtnGreen);             // 将绿色单选按钮添加到水平布局2// 创建一个多行文本编辑框,用于显示或输入文本txtEdit = new QPlainTextEdit;               // 创建一个纯文本编辑框//将文本编辑框的字体大小调大auto font = txtEdit->font();font.setPointSize(20);txtEdit->setFont(font);// 创建操作按钮btnOk = new QPushButton("确认");            // 确认按钮btnCancel = new QPushButton("取消");        // 取消按钮btnClose = new QPushButton("关闭");         // 关闭按钮hLayout3 = new QHBoxLayout;                 // 创建水平布局3hLayout3->addWidget(btnOk);                 // 将确认按钮添加到水平布局3hLayout3->addWidget(btnCancel);             // 将取消按钮添加到水平布局3hLayout3->addStretch();                     // 添加一个可拉伸的空间,使按钮靠左对齐hLayout3->addWidget(btnClose);              // 将关闭按钮添加到水平布局3vLayout = new QVBoxLayout;                  // 创建垂直布局vLayout->addLayout(hLayout1);               // 将水平布局1(字体复选框)添加到垂直布局vLayout->addLayout(hLayout2);               // 将水平布局2(颜色单选按钮)添加到垂直布局vLayout->addWidget(txtEdit);                // 将文本编辑框添加到垂直布局vLayout->addLayout(hLayout3);               // 将水平布局3(操作按钮)添加到垂直布局setLayout(vLayout);                         // 将垂直布局设置为当前窗口的布局
}void Dialog::initSignalSlots()
{//复选框connect(chkBoxUnderLine, SIGNAL(clicked(bool)),this, SLOT(onChkBoxUnderLine(bool)));connect(chkBoxItalic, SIGNAL(clicked(bool)),this, SLOT(onChkBoxItalic(bool)));connect(chkBoxBold, SIGNAL(clicked(bool)),this, SLOT(onChkBoxBold(bool)));//单选框connect(rBtnBlack, SIGNAL(clicked()), this, SLOT(setTextFontColor()));connect(rBtnRed, SIGNAL(clicked()), this, SLOT(setTextFontColor()));connect(rBtnGreen, SIGNAL(clicked()), this, SLOT(setTextFontColor()));//功能按钮connect(btnOk, SIGNAL(clicked()), this, SLOT(pushButtonOk()));connect(btnCancel, SIGNAL(clicked()), this, SLOT(pushButtonCancel()));connect(btnClose, SIGNAL(clicked()), this, SLOT(close()));
}// 当下划线复选框被点击时,该槽函数会被调用。
// 参数 clicked 表示复选框的当前状态(true 表示选中,false 表示未选中)。
void Dialog::onChkBoxUnderLine(bool clicked)
{// 获取文本编辑框当前的字体auto font = txtEdit->font();// 根据复选框的状态设置字体的下划线属性font.setUnderline(clicked);// 将修改后的字体重新设置回文本编辑框txtEdit->setFont(font);
}// 当斜体复选框被点击时,该槽函数会被调用。
void Dialog::onChkBoxItalic(bool clicked)
{// 获取文本编辑框当前的字体auto font = txtEdit->font();// 根据复选框的状态设置字体的斜体属性font.setItalic(clicked);// 将修改后的字体重新设置回文本编辑框txtEdit->setFont(font);
}// 当粗体复选框被点击时,该槽函数会被调用。
void Dialog::onChkBoxBold(bool clicked)
{// 获取文本编辑框当前的字体auto font = txtEdit->font();// 根据复选框的状态设置字体的粗体属性font.setBold(clicked);// 将修改后的字体重新设置回文本编辑框txtEdit->setFont(font);
}// 设置文本编辑框的文字颜色
void Dialog::setTextFontColor()
{// 获取文本编辑框的当前调色板auto palette = txtEdit->palette();// 检查黑色单选按钮是否被选中if (rBtnBlack->isChecked()) {// 如果黑色单选按钮被选中,将调色板中的文字颜色设置为黑色palette.setColor(QPalette::Text, Qt::black);} // 检查红色单选按钮是否被选中else if (rBtnRed->isChecked()) {// 如果红色单选按钮被选中,将调色板中的文字颜色设置为红色palette.setColor(QPalette::Text, Qt::red);} // 检查绿色单选按钮是否被选中else if (rBtnGreen->isChecked()) {// 如果绿色单选按钮被选中,将调色板中的文字颜色设置为绿色palette.setColor(QPalette::Text, Qt::green);}// 将修改后的调色板重新应用到文本编辑框txtEdit->setPalette(palette);
}void Dialog::pushButtonOk()
{auto text = txtEdit->toPlainText();     //将文本转换为QStringauto strList = text.split("\n");QString ret;for(auto& str: strList) {ret += str[0];}QMessageBox::information(this, "提示", ret);
}void Dialog::pushButtonCancel()
{QMessageBox::information(this, "提示", "已取消");
}

3. main.cpp:

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}
2、运行结果

点击确认 

点击取消 

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

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

相关文章

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样&#xff1f; 这里描述自己在使用AI进行数据分析&#xff08;数据清洗&#xff09;过程中的几个小故事&#xff1a; 1. 变量名的翻译 有一个项目是某医生自己收集的数据&#xff0c;变量名使用的是中文&#xff0c;分…

C++11 thread

文章目录 C11 线程库线程对象的构造方式无参的构造函数调用带参的构造函数调用移动构造函数thread常用成员函数 this_thread命名空间join && detachmutex C11 线程库 线程对象的构造方式 无参的构造函数 1、调用无参的构造函数,调用无参的构造函数创建出来的线程对象…

List<Map<String, Object>> 如何对某个字段求和

在Java中&#xff0c;如果你有一个List<Map<String, Object>>的结构&#xff0c;并且你想要对某个特定字段进行求和&#xff0c;你可以使用Java 8的Stream API来简化这个过程。下面是一个示例代码&#xff0c;演示如何对某个字段进行求和。 假设你有一个List<M…

Linux 固定 IP 地址和网关

Linux 固定 IP 地址和网关 查看 IP ifconfig ifconfig eth0 ip addr ip addr show eth0 查看网关 ip route show route -n netstat -rn 设置固定 IP // 配置静态IP文件/etc/network/interfaces $ vi /etc/network/interfacesauto eth0 iface eth0 inet static addre…

移动通信发展史

概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通&#xff1a;成立于 2000 年…

进阶数据结构——树状数组

前言 看这篇文章前我建议你们先看这个视频还有这个视频&#xff0c;不然你们可能看不懂。 一、树状数组的核心思想与本质 核心思想&#xff1a;树状数组&#xff08;Fenwick Tree&#xff09;是一种用于高效处理前缀和查询和单点更新的数据结构。 本质&#xff1a;通过二进…

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…

STM32 CAN过滤器配置和应用方法介绍

目录 概述 一、CAN过滤器核心概念 二、过滤器配置步骤&#xff08;以标准ID为例&#xff09; 三、不同模式的配置示例 四、高级配置技巧 五、调试与问题排查 六、关键计算公式 总结 概述 在STM32微控制器中&#xff0c;CAN过滤器可以配置为标识符屏蔽模式和标识符列表模…

个人系统架构技术分享

架构技术 技术版本说明CentOS7.9操作系统Amoeba负责MySQL读写分离NFS分布式存储ISCSI块存储keepalived日志收集MySQL5.7数据库存储MinIO8.4.5对象存储Kubernetes1.23.15应用容器管理平台Redis7.0分布式缓存Elasticsearch7.17.3搜索引擎nacos3.3.4服务注册 后端技术 技术版本…

python进阶篇-面向对象

1.对象的定义 1.1 什么是对象 面向过程&#xff1a;将程序流程化 对象&#xff1a;就是“容器“&#xff0c;是用来存储数据和功能的&#xff0c;是数据和功能的集合体。 面向对象和面向过程没有优劣之分&#xff0c;它们只是使用的场景不同罢了。 1.2 为什么要有对象 有…

网络安全“挂图作战“及其场景

文章目录 一、网络安全挂图作战来源与定义1、网络安全挂图作战的来源2、网络安全挂图作战的定义 二、挂图作战关键技术三、挂图作战与传统态势感知的差异四、挂图作战主要场景五、未来趋势结语 一、网络安全挂图作战来源与定义 1、网络安全挂图作战的来源 网络安全挂图作战的…

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…

嵌入式八股文(四)计算机网络篇

第一章 基础概念 1. 服务 指网络中各层为紧邻的上层提供的功能调用,是垂直的。包括面向连接服务、无连接服务、可靠服务、不可靠服务。 2. 协议 是计算机⽹络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。⽹络协议的三个基本要素:语法、…

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源&#xff0c;其储量丰富&#xff0c;预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性&#xff0c;天然气水合物的探测面临诸多挑战&#xff0c;涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…

JAVA代码走查重构常用prompt

代码重构prompt&#xff1a; ## 主题&#xff1a; 代码重构 ## 角色扮演: 你是软件开发大师Martin Fowler&#xff0c;精通代码重构、面向对象编程、Clean Code和设计模式&#xff0c;且熟练掌握《重构&#xff0c;改善既有代码的设计》这本书中的重构思想和各种重构方法。 ## …

[数据结构]红黑树,详细图解插入

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入&#xff08;步骤&#xff09; 1.为什么新插入的节点必须给红色&#xff1f; 2、插入红色节点后&#xff0c;判定红黑树性质是否被破坏 五、插入出现连续红节点情况分析图解&#xff08;看…

STM32 HAL库USART串口DMA IDLE中断编程:避坑指南

HAL_UART_Receive接收最容易丢数据了,STM32 HAL库UART查询方式实例 可以考虑用中断来实现,但是HAL_UART_Receive_IT还不能直接用,容易数据丢失,实际工作中不会这样用,STM32 HAL库USART串口中断编程&#xff1a;演示数据丢失, 需要在此基础优化一下. STM32F103 HAL库USART串口…

sql注入中information_schema被过滤的问题

目录 一、information_schema库的作用 二、获得表名 2.1 sys.schema_auto_increment_columns 2.2 schema_table_statistics 三、获得列名 join … using … order by盲注 子查询 在进行sql注入时&#xff0c;我们经常会使用information_schema来进行爆数据库名、表名、…

Jenkins 给任务分配 节点(Node)、设置工作空间目录

Jenkins 给任务分配 节点(Node)、设置工作空间目录 创建 Freestyle project 类型 任务 任务配置 Node 打开任务-> Configure-> General 勾选 Restrict where this project can be run Label Expression 填写一个 Node 的 Label&#xff0c;输入有效的 Label名字&#x…

Electron:使用electron-react-boilerplate创建一个react + electron的项目

使用 electron-react-boilerplate git clone --depth 1 --branch main https://github.com/electron-react-boilerplate/electron-react-boilerplate.git your-project-name cd your-project-name npm install npm start 安装不成功 在根目录加上 .npmrc文件 内容为 electron_…