【QT】QT中的信号与槽

news2025/5/19 11:39:38

QT中的信号与槽

  • 一、信号与槽函数的作用
  • 二、如何关联信号与槽函数
    • 1、借助集成开发环境,右键转到槽函数
      • 示例代码:
    • 2、调用connect函数手动关联信号与槽函数
  • 三、扩展
  • 四、总结信号与槽的特点
    • 1、一个类如果要使用信号以及槽函数,那么该类的定义中必须加上Q_OBJECT宏定义
    • 2、同一个槽函数,可以被不同对象的信号关联
    • 3、同一个信号,可以关联不同的槽函数
    • 4、信号的发送者跟信号之间必须是所属关系(发送者对应的类里面必须有这个信号)
    • 5、信号带参数,槽函数可以带参数,也可以不带参数
  • 五、获取信号的发送者
    • 示例代码:
  • 六、自定义信号,发送信号
    • 示例代码:

一、信号与槽函数的作用

用来在组件和组件,组件和窗口之间通信

  • 信号:QT中给每个组件都定义了信号,每个信号都有它特定的触发条件(QT助手查询到每个信号的触发条件)

QT中所有的信号,本质上都是个函数,信号只有声明,没有源代码

比如:以按钮为例,常用的信号如下
       [signal] void QAbstractButton::clicked(bool checked = false)  //当按钮按下去,然后松开的时候自动触发这个信号
       [signal] void QAbstractButton::released()  //按钮松开会触发该信号
       [signal] void QAbstractButton::pressed()   //按钮按下去触发该信号
  • 槽函数:当某个信号触发的时候,跟这个信号对应的槽函数会被自动调用执行

二、如何关联信号与槽函数

关联信号与槽函数:就是使选择的信号跟槽函数形成一一对应关系

1、借助集成开发环境,右键转到槽函数

  • 头文件中会自动生成槽函数的声明
private slots:   //声明了一个私有的槽函数
	void on_pushButton_clicked();  //槽函数的原型声明
  • 在源码.cpp文件中自动生成的槽函数的定义

on_对象的名字_信号的名字();

示例代码:

// login.cpp
#include "loginwin.h"
#include "ui_loginwin.h"
#include <QLabel>
#include <QFont>
#include <QLineEdit>
#include <QPushButton>
#include <iostream>
#include <QDebug>
using namespace std;
loginwin::loginwin(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::loginwin)
{
    ui->setupUi(this);
    //通过写代码把登录界面的ui做出来
    //第一步:标签
    //父窗口:这个组件(控件)等一会在哪个窗口上显示,这个窗口就是父窗口
    QLabel *lb1=new QLabel("学生管理系统",this);
    //设置按钮的坐标,宽高
    /*
        规律:任何组件,属性都有对应的设置方法,方法的名字统一叫做setxxx()
             比如:属性geometry --》对应的方法setGeometry()
    */
    lb1->setGeometry(200,10,400,100);
    QFont myfont("楷体",24);
    lb1->setFont(myfont);
    //设置样式
    lb1->setStyleSheet("color:rgb(255,0,0);");
    //第二步:两个单行输入框
    QLineEdit *le1=new QLineEdit(this);
    QLineEdit *le2=new QLineEdit(this);
    //设置坐标,宽高
    le1->setGeometry(220,130,300,50);
    le2->setGeometry(220,220,300,50);
    //设置默认提示文字
    le1->setPlaceholderText("请输入用户名");
    le2->setPlaceholderText("请输入密码");
    //设置用户名,密码位数
    le1->setMaxLength(8);
    le2->setMaxLength(8);
    //设置密码隐藏
    le2->setEchoMode(QLineEdit::Password);
    //设置样式
    le1->setStyleSheet("border:2px solid#ff0000;");
    le2->setStyleSheet("border:2px solid#ff0000;");
    //设置字体
    le1->setFont(myfont);
    le2->setFont(myfont);
    //第三步:两个按钮
    QPushButton *bt1=new QPushButton("登录",this);
    QPushButton *bt2=new QPushButton("注册",this);
    bt1->setFont(myfont);
    bt2->setFont(myfont);
    //设置坐标,宽高
    bt1->setGeometry(200,300,100,50);
    bt2->setGeometry(450,300,100,50);

    //给主窗口设置边框图片
    this->setStyleSheet("QMainWindow{border-image: url(C:/Users/Administrator/Desktop/share/4.jpeg);}");
}

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

//跟登录按钮有关的槽函数
//槽函数的定义--》代码由程序员来编写
void loginwin::on_pushButton_clicked()
{
    //C++的输出
    //cout<<"登录按钮被点击(按下去,然后松开)"<<endl;
    //cout<<"loginbt clicked"<<endl;
    //QT特有的输出,自动换行,不需要回车
    qDebug()<<"登录按钮被点击(按下去,然后松开)";
}

//跟release信号有关的槽函数
void loginwin::on_pushButton_released()
{
    qDebug()<<"登录按钮松开";
}
//跟pressed信号有关的槽函数
void loginwin::on_pushButton_pressed()
{

}

// login.h
#ifndef LOGINWIN_H
#define LOGINWIN_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class loginwin; }
QT_END_NAMESPACE

class loginwin : public QMainWindow
{
    Q_OBJECT

public:
    loginwin(QWidget *parent = nullptr);
    ~loginwin();

//翻译qt程序--》uic和moc(qt程序除了c++代码之外还有qt特有的(例如信号与槽),所有需要翻译成c++代码)
//slots是QT特有的关键字,C++中没有
private slots:  //声明私有的槽函数
    //在源码.cpp文件中自动生成的槽函数的定义,命名有规律
    //on_对象的名字_信号的名字();
    void on_pushButton_clicked(); //槽函数的原型声明

    void on_pushButton_released(); //槽函数的原型声明

    void on_pushButton_pressed();  //槽函数的原型声明

private:
    Ui::loginwin *ui;
};
#endif // LOGINWIN_H

2、调用connect函数手动关联信号与槽函数

有些场合无法右键转到槽(比如:按钮不是ui设计师拖过去,而是通过写代码new出来)

  • 写法1:
connect(QObject *sender, PointerToMemberFunction signal,QObject *receiver, PointerToMemberFunction method)
  • 写法2
connect(发送者指针,&类的名字::信号的名字,接收者,&类的名字::槽函数)
                    参数:sender --》信号的发送者,指针
                          signal --》发送什么信号
                          receiver --》信号的接收者
                          method --》需要调用的槽函数
                                    槽函数命名时候,可以跟自动生成的槽函数命名规律保持一致,也可以自行单独命名
比如:connect(ui->handlebt,SIGNAL(clicked(bool)),this,SLOT(fun())); //关联了handlebt这个按钮的clicked信号和槽函数fun()

QT使用技巧:头文件中声明了函数,右键选择refactor,可以在.cpp生成函数的定义

三、扩展

QObject --》QT中所有类的基类
作为形参的好处:实参可以传递任何类型(因为QT中所有的类都是QObject的子类)

四、总结信号与槽的特点

1、一个类如果要使用信号以及槽函数,那么该类的定义中必须加上Q_OBJECT宏定义

Q_OBJECT:QT把它称为元对象系统,作用支持信号与槽这种机制

在这里插入图片描述

2、同一个槽函数,可以被不同对象的信号关联

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 同一个槽函数,可以被不同对象的信号关联
    connect(ui->btn1, SIGNAL(clicked()), this, SLOT(btn()));
    connect(ui->btn2, SIGNAL(clicked()), this, SLOT(btn()));
    connect(ui->btn3, SIGNAL(clicked()), this, SLOT(btn()));
}

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

void MainWindow::btn()
{
    qDebug()<<"按钮按下";
}
//===========================================//
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void btn();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

3、同一个信号,可以关联不同的槽函数

槽函数的调用顺序跟关联的先后顺序一致,先关联的先调用

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

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

    //同一个信号,可以关联不同的槽函数
    //槽函数的调用顺序关联的先后顺序一致,先关联的先调用
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn2()));
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn1()));
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn3()));
}

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

void MainWindow::btn1()
{
    qDebug()<<"按下btn1";
}

void MainWindow::btn2()
{
    qDebug()<<"按下btn2";
}

void MainWindow::btn3()
{
    qDebug()<<"按下btn3";
}
//=======================================================//
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void btn1();
    void btn2();
    void btn3();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

4、信号的发送者跟信号之间必须是所属关系(发送者对应的类里面必须有这个信号)

信号的接收者跟槽函数之间必须是所属关系(接收者对应的类里面必须有这个槽函数)

// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //自己手动管理按钮的clicked信号跟自己写的槽函数
    /*
        信号的发送者跟信号之间必须是所属关系(发送者对应的类里面必须有这个信号)
        信号的接收者跟槽函数之间必须是所属关系(接收者对应的类里面必须有这个槽函数)
    */
    //错误1:信号发送者跟信号之间不是所属关系
    //connect(ui->pushButton,SIGNAL(textChanged(QString)),this,SLOT(fun()));
    //错误2:信号接收者跟槽函数之间不是所属关系
    //connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(myfun()));
    connect(ui->pushButton,SIGNAL(clicked()),ui->lineEdit,SLOT(fun()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
//自己手写的槽函数
void MainWindow::fun()
{
    qDebug()<<"按钮被点击了";
}

 // mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    //自己手写槽函数,命名可以跟右键转到槽一样的命名,也可以随意命名
    void fun();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

5、信号带参数,槽函数可以带参数,也可以不带参数

区别:

  • 槽函数带参数,参数必须跟信号保持一致,表示槽函数接收信号传递过来的参数
  • 槽函数不带参数,表示不接收信号传递过来的参数

注意:

  • 如果信号没有任何参数,此时槽函数也不可以有任何参数
  • 信号带了参数,connect写的时候不要写参数的名字,只需要写参数的类型
  • 槽函数带了参数,connect写的时候不要写参数的名字,只需要写参数的类型

五、获取信号的发送者

作用:当多个组件对象共用一个槽函数的时候,程序员需要知道是哪个组件对象触发的信号,此时就要获取信号的发送者

QObject *sender() const
           返回值:返回一个指针,该指针指向信号的发送者
QT中转换函数
    qobject_cast(QObject *object)  //把父类的指针转换成子类地址

示例代码:

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 同一个槽函数,可以被不同对象的信号关联
    connect(ui->btn1, SIGNAL(clicked()), this, SLOT(btn()));
    connect(ui->btn2, SIGNAL(clicked()), this, SLOT(btn()));
    connect(ui->btn3, SIGNAL(clicked()), this, SLOT(btn()));
}

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

void MainWindow::btn()
{
//    qDebug()<<"按钮按下";
    // 获取信号的发送者,并判断哪个按钮被按下
    QObject *is_sender = sender();
    if(is_sender == ui->btn1)
        qDebug()<<"按钮1按下";
    else if(is_sender == ui->btn2)
        qDebug()<<"按钮2按下";
    else if(is_sender == ui->btn3)
        qDebug()<<"按钮3按下";

    // QT中转换函数的使用
    QPushButton *btn = qobject_cast<QPushButton *>(is_sender);
    btn->setStyleSheet("background-color:rgb(0,255,0);");
}

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void btn();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

六、自定义信号,发送信号

//自定义信号语法格式
     signals:
             // 自定义信号;
             void mysignal(参数)//参数的类型个数依据需要自行添加
//发送信号
     //注意注意注意:自定义的信号必须程序员主动调用emit发送,不能自动触发的
             emit mysignal(实参);

示例代码:

// 第一个界面:mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "info_win.h"
#include <QString>
#include <QDebug>

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

MainWindow::~MainWindow()
{
    delete ui;
}
// 登录按钮的槽函数
void MainWindow::on_pushButton_clicked()
{
    // 获取输入的用户名和密码
    QString account = ui->lineEdit->text();
    QString pswd = ui->lineEdit_2->text();

    if(account == "aaa" && pswd == "123")
    {
        //创建第二个界面对象,必须传递this指针(把第一个界面的地址传给第二个界面)
        info_win *info_w = new info_win(this);
        // 将第一个界面的账号和密码传递给第二个界面 --信号发送
        connect(this, SIGNAL(sendSign(QString, QString)), info_w, SLOT(recvSlot(QString, QString)));
        emit sendSign(account, pswd);
        qDebug()<<"第一界面的地址是"<<this;
        // 显示第二个界面
        info_w->show();
        this->hide();
    }
    else
    {
        qDebug()<<"账号或密码错误,重新输入";
    }
}

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals: //自定义信号
    void sendSign(QString, QString);

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

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

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

相关文章

使用Python爬虫获取1688商品(按图搜索)接口

一、引言 随着电商行业的不断发展&#xff0c;消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品搜索功能&#xff0c;其中按图搜索功能&#xff08;类似于淘宝的拍立淘&#xff09;极大地提升了用户的购物体验。本文将…

AI Agent拐点已至,2B+2C星辰大海——行业深度报告

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告&#xff0c;报告从AI Agent商业化应用、C端B端应用与布局&#xff0c;投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF&#xff0c;文末有完整版下载地址。 内容摘要 2025年…

【CSS】- 表单控件的 placeholder 如何控制换行显示?

表单控件的 placeholder 如何换行展示&#xff1f; HTML 中&#xff0c;<textarea> 元素的 placeholder 属性默认情况下不支持换行。不过&#xff0c;可以通过以下几种方法来实现换行效果&#xff1a; 模版字符串 模板字符串可以轻松地创建多行字符串&#xff0c;而不…

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境&#xff0c;主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务&#xff0c;突破了 JavaScript 仅在浏览器中运行的限制。 npm&#xff08;Node Package Man…

基于HTML5和CSS3实现3D旋转相册效果

基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…

上市电子制造企业如何实现合规的质量文件管理?

浙江洁美电子科技股份有限公司成立于2001年&#xff0c;是一家专业为片式电子元器件(被动元件、分立器件、集成电路及LED)配套生产电子薄型载带、上下胶带、离型膜、流延膜等产品的国家高新技术企业&#xff0c;主要产品有分切纸带、打孔经带、压孔纸带、上下胶带、塑料载带及其…

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果&#xff0c;使得编辑器在滚动到某个位置时会“粘”在那里&#xff0c;而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…

IDEA如何设置以新窗口打开新项目

在 IntelliJ IDEA 中设置以新窗口打开新项目&#xff0c;可以通过以下两种方式实现&#xff1a; 方法 1&#xff1a;通过对话框提示选择新窗口 打开项目时&#xff1a; 当通过 File > Open&#xff08;或欢迎界面点击 Open&#xff09;选择新项目时&#xff0c;IDEA 会弹出对…

【含文档+PPT+源码】基于微信小程序的社交摄影约拍平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社交摄影约拍平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

Springboot集成Dubbo和Zookeeper框架搭建

目录 1.搭建环境 2.搭建步骤 3.效果展示 4.注意项 1.搭建环境如下图所示&#xff1a; 2.搭建步骤 2.1 目标概述 一共三个服务,一个公共接口服务,一个提供者服务,一个消费者服务。最终以浏览器或者postman查询接口,实现订单信息回显。最终项目结构如图所示&#xff1a; 2.2 …

发票管理自动化-发票查验接口让财务告别繁琐的核验流程

发票管理的效率与准确性直接影响着企业运营的顺畅性&#xff0c;在过去&#xff0c;财务人员查验发票时&#xff0c;需手工输入发票代码、号码、日期、金额、验证码等信息一张一张进行核验。整个过程不仅操作繁琐&#xff0c;而且极易出错。若遇到验证码难以辨认的情况&#xf…

基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)

C#编写ModbusTcp类库,模拟plc进行本地通信测试 Modbus是一个应用层协议,常用于工业自动化设备之间的通信,主要有两种传输方式:RTU和TCP。 常见的功能码包括读取线圈(01)、读取离散输入(02)、读保持寄存器(03)、读输入寄存器(04)、写单个线圈(05)、写单个寄存器(…

IS-IS:单区域集成配置与多区域集成配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09; 是一种链路状态内部网关协议&#xff08;IGP&#xff09;&#xff0c;设计用于自治系统&#xff08;AS&#xff09;内部的路由选择。最初由ISO为OSI模型的无连接网络服务&#xff08;…

API 安全之认证鉴权

作者&#xff1a;半天 前言 API 作为企业的重要数字资源&#xff0c;在给企业带来巨大便利的同时也带来了新的安全问题&#xff0c;一旦被攻击可能导致数据泄漏重大安全问题&#xff0c;从而给企业的业务发展带来极大的安全风险。正是在这样的背景下&#xff0c;OpenAPI 规范…

[测试] Google Test | 主流的 C 测试框架

目录 GoogleTest 2. 准备工作 3. 测试 4.怎么用 Attention is All You Need 写项目代码的时候 边写边测试 非常重要&#xff0c;这样可以帮助我们减少很多的问题。 这篇文章后面 主要以 GoogleTest 为例&#xff0c;进行介绍最近找了些 gtest 相关的资料,学习了下.后面主要…

OpenCV 图形API(3)高层次设计概览

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 G-API 是一个异构框架&#xff0c;提供了统一的 API 来使用多个支持的后端编程图像处理流水线。 关键的设计理念是在指定使用哪些内核和设备时保持流…

碰一碰发视频网页版本开发的源码搭建指南

引言 在数字化信息快速传播的时代&#xff0c;近场通信&#xff08;NFC&#xff09;技术为信息交互带来了新的便捷方式。通过网页版本实现碰一碰发视频功能&#xff0c;能够让用户在浏览器环境中轻松实现视频分享&#xff0c;拓展了视频传播的途径。本文将详细介绍碰一碰发视频…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

Redis-16.在Java中操作Redis-Spring Data Redis使用方式-操作有序集合类型的数据

一. 操作有序集合类型的数据 package com.sky.test;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*;imp…

STM32智能手表——任务线程部分

RTOS和LVGL我没学过&#xff0c;但是应该能硬啃这个项目例程 ├─Application/User/Tasks # 用于存放任务线程的函数 │ ├─user_TaskInit.c # 初始化任务 │ ├─user_HardwareInitTask.c # 硬件初始化任务 │ ├─user_RunModeTasks.c…