[Qt] 信号与槽:深入浅出跨UI与跨线程的信号发送

news2024/10/10 23:06:11


文章目录

  • 如何自定义信号并使用
    • 自定义信号的步骤
      • 1.使用 `signals` 声明信号
      • 2. 信号的返回值是 `void`
      • 3. 在需要发送信号的地方使用 `emit`
      • 4. 使用 `connect` 链接信号和槽
      • 5. 完整代码示例
      • 总结
  • 如何跨UI发送信号
    • Qt跨UI发送信号机制详解
    • 案例概述
    • Qt 信号与槽机制简介
    • 代码逻辑详解
      • 主窗口 `Widget` 类
      • 对话框 `SetDialog` 类
    • 信号和槽的连接
    • 总结
  • 如何跨线程发送信号
      • 在Qt中如何跨线程发送信号并更新UI
      • 子线程不能直接操作UI
      • 信号与槽机制在跨线程中的作用
      • 示例代码讲解:子线程发送信号更新UI
        • 定义子线程类 `ChildThread`
        • 定义主窗口类 `Widget`
        • 主程序入口 `main.cpp`
      • 代码运行结果
      • 总结

如何自定义信号并使用

在Qt中,自定义信号 是 Qt 核心功能之一,它允许我们在自定义类中定义信号,并通过信号与槽机制实现对象之间的通信。信号一般与事件相关,比如按钮点击、数据更新等。当事件发生时,信号被触发,并通过槽函数来处理事件。

自定义信号的步骤

让我们逐步讲解如何定义和使用自定义信号,基于以下四个关键步骤:

  1. 使用 signals 关键字声明信号
  2. **信号的返回值为 **void
  3. 在需要发送信号的地方使用 emit 关键字
  4. 使用 connect 将信号和槽连接起来

下面我们通过详细的代码示例来展示如何自定义信号。


1.使用 signals 声明信号

自定义信号需要在类的头文件中用 signals: 关键字来声明。信号就像函数的声明,必须包含函数的参数类型和数量。

  • 注意:信号的返回值类型总是 void,并且只定义函数原型,不需要实际的实现。
class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);

signals:
    // 自定义信号,发送一个整型参数
    void myCustomSignal(int value);

private:
    QPushButton *myButton;
};

在这个示例中,我们声明了一个信号 myCustomSignal(int value)。这个信号会传递一个 int 类型的参数。

2. 信号的返回值是 void

所有的信号返回值类型必须是 void,即使你定义信号时可能习惯给函数返回某个值,但在 Qt 的信号机制中,信号是不返回任何值的。信号只是通知槽函数或其他接收方事件发生,并不会处理返回值。

3. 在需要发送信号的地方使用 emit

一旦定义了信号,下一步就是在程序的合适位置发射信号。我们使用 emit 关键字来发射信号。当一个信号被发射时,它会通知所有连接到该信号的槽函数。

void MyWidget::someFunction()
{
    int someValue = 42; // 假设这是我们要发送的值
    emit myCustomSignal(someValue); // 使用emit发射信号
}

这里我们在 someFunction() 函数中,使用 emit myCustomSignal(someValue) 发射了信号 myCustomSignal,并将 someValue 传递给接收方。

4. 使用 connect 链接信号和槽

发射信号后,还需要将信号与槽函数连接起来。我们通过 connect() 函数,将信号和相应的槽函数连接:

connect(senderObject, &SenderClass::signal, receiverObject, &ReceiverClass::slot);

其中:

  • senderObject 是发射信号的对象。
  • SenderClass::signal 是信号名称。
  • receiverObject 是接收信号的对象。
  • ReceiverClass::slot 是槽函数名称。

假设我们要将 myCustomSignal 信号连接到某个槽函数 onCustomSignalReceived,代码如下:

class ReceiverWidget : public QWidget
{
    Q_OBJECT

public:
    ReceiverWidget(QWidget *parent = nullptr);

public slots:
    void onCustomSignalReceived(int value)
    {
        qDebug() << "Received value:" << value;
    }
};

然后在 MyWidget 类中:

void MyWidget::setupConnections(ReceiverWidget *receiver)
{
    // 将自定义信号 myCustomSignal 与 ReceiverWidget 的槽函数 onCustomSignalReceived 连接
    connect(this, &MyWidget::myCustomSignal, receiver, &ReceiverWidget::onCustomSignalReceived);
}

5. 完整代码示例

我们将以上所有步骤整合到一个完整的示例中。

mywidget.h: 定义发送信号的类 MyWidget

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);

signals:
    // 自定义信号,传递一个整型数值
    void myCustomSignal(int value);

private slots:
    void handleButtonClick(); // 按钮点击槽函数

private:
    QPushButton *myButton; // 一个按钮
};

#endif // MYWIDGET_H

mywidget.cpp: 实现发送信号的类 MyWidget

#include "mywidget.h"
#include <QVBoxLayout>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    myButton = new QPushButton("Click Me", this);

    // 布局设置
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(myButton);

    connect(myButton, &QPushButton::clicked, this, &MyWidget::handleButtonClick);
}

void MyWidget::handleButtonClick()
{
    int value = 42; // 示例数值
    emit myCustomSignal(value); // 发射信号
}

receiverwidget.h: 定义接收信号的类 ReceiverWidget

#ifndef RECEIVERWIDGET_H
#define RECEIVERWIDGET_H

#include <QWidget>
#include <QLabel>

class ReceiverWidget : public QWidget
{
    Q_OBJECT

public:
    ReceiverWidget(QWidget *parent = nullptr);

public slots:
    void onCustomSignalReceived(int value); // 槽函数

private:
    QLabel *label;
};

#endif // RECEIVERWIDGET_H

receiverwidget.cpp: 实现接收信号的类 ReceiverWidget

#include "receiverwidget.h"
#include <QVBoxLayout>

ReceiverWidget::ReceiverWidget(QWidget *parent)
    : QWidget(parent)
{
    label = new QLabel("Waiting for signal...", this);

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(label);
}

void ReceiverWidget::onCustomSignalReceived(int value)
{
    label->setText(QString("Received value: %1").arg(value));
}

main.cpp: 主程序入口,创建并连接信号与槽

#include <QApplication>
#include "mywidget.h"
#include "receiverwidget.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget senderWidget;
    ReceiverWidget receiverWidget;

    // 将信号连接到槽
    QObject::connect(&senderWidget, &MyWidget::myCustomSignal, &receiverWidget, &ReceiverWidget::onCustomSignalReceived);

    senderWidget.show();
    receiverWidget.show();

    return app.exec();
}

总结

通过以上步骤,您可以在Qt中自定义信号,并在不同对象之间传递数据。具体步骤如下:

  1. 使用 signals: 关键字在类中声明信号。
  2. 信号的返回值必须是 void
  3. 在合适的地方通过 emit 关键字发射信号。
  4. 使用 connect() 函数将信号和槽连接起来,实现对象间的通信。

信号与槽机制是Qt中非常强大的功能,它极大地简化了对象间的通信,特别是在UI开发中,广泛用于按钮点击、数据更新等场景。

如何跨UI发送信号

Qt跨UI发送信号机制详解

在Qt中,信号与槽机制(Signals and Slots)是其核心特性之一。它允许不同对象之间通过发送和接收信号进行通信,而不需要直接引用。一个典型的应用场景是跨界面(UI)传递数据。在这篇文章中,我们将结合一个完整的示例来演示如何通过信号和槽在两个窗口间(WidgetSetDialog)发送和接收数据。

这篇文章主要面向Qt的初学者,带你一步步理解和实现这一机制。


案例概述

我们将实现一个包含两个窗口的小项目:

  • Widget:主窗口,包含一个按钮和一个文本框。点击按钮后,弹出另一个窗口 SetDialog
  • SetDialog:对话框窗口,包含一个按钮,点击按钮后将产生一个数值,并通过信号将该数值发送给主窗口。

目标:在SetDialog窗口中点击按钮,生成数值,并将数值显示在Widget窗口中的文本框中。


Qt 信号与槽机制简介

在Qt中,信号(Signal)是用于通知某个事件发生的机制,而(Slot)是一个可以连接到信号的函数。当信号发射时,与之连接的槽函数就会被调用。

  • 信号的特点:信号本身不包含任何实现,它只是一个接口。信号通常在类中作为 signals: 下的定义。
  • 槽的特点:槽函数可以是普通的成员函数,也可以是lambda表达式。

我们通过connect()函数将信号和槽连接起来。

代码逻辑详解

主窗口 Widget

首先,我们来看主窗口的类定义。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    void on_btnOpen_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

这里的Widget类继承自QWidget,代表主窗口。在这个窗口中,我们声明了一个槽函数 on_btnOpen_clicked(),用于处理按钮点击事件。

接下来我们来看实现部分。

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "setdialog.h"

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

    // 连接按钮点击信号到槽函数
    connect(ui->btnOpen, &QPushButton::clicked, this, &Widget::on_btnOpen_clicked);
}

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

void Widget::on_btnOpen_clicked()
{
    SetDialog dlg;

    // 连接SetDialog中的sig_addOne信号到主窗口的lambda槽函数
    connect(&dlg, &SetDialog::sig_addOne, [=](int value) {
        ui->lineEdit->setText(QString::number(value));
    });

    // 打开对话框,进入事件循环
    dlg.exec();
}
  • connect():在构造函数中,我们将btnOpen按钮的点击信号连接到槽函数on_btnOpen_clicked(),以响应点击事件。
  • on_btnOpen_clicked():当点击按钮时,弹出 SetDialog 对话框。同时,我们将SetDialog中的信号sig_addOne连接到主窗口的lambda槽函数,以便接收数值,并将其显示在文本框lineEdit中。

注意:我们使用了lambda表达式作为槽函数,可以方便地在槽中使用局部变量。

对话框 SetDialog

接下来是 SetDialog 类的定义和实现。

setdialog.h

#ifndef SETDIALOG_H
#define SETDIALOG_H

#include <QDialog>

namespace Ui {
class SetDialog;
}

class SetDialog : public QDialog
{
    Q_OBJECT

public:
    explicit SetDialog(QWidget *parent = nullptr);
    ~SetDialog();

private slots:
    void on_btnAdd_clicked();

signals:
    void sig_addOne(int value); // 定义信号

private:
    Ui::SetDialog *ui;
};

#endif // SETDIALOG_H
  • 信号定义:在 signals: 关键字下,我们声明了一个名为 sig_addOne(int value) 的信号。这个信号将会发送一个整数。
  • 槽函数on_btnAdd_clicked() 是槽函数,处理对话框中按钮的点击事件。

setdialog.cpp

#include "setdialog.h"
#include "ui_setdialog.h"

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

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

void SetDialog::on_btnAdd_clicked()
{
    static int value = 100; // 静态变量,每次点击都会递增
    emit sig_addOne(value++); // 发射信号,将当前数值传递给主窗口
}
  • emit** 关键字**:在槽函数 on_btnAdd_clicked() 中,我们使用 emit 关键字来发射信号 sig_addOne,并将数值 value 作为参数传递给主窗口。

信号和槽的连接

现在我们来回顾一下信号和槽的连接过程:

  1. Widget类中,我们弹出了SetDialog窗口,并通过connect()SetDialog中的信号sig_addOne连接到主窗口中的槽函数(lambda表达式)。
  2. 当用户在SetDialog窗口中点击按钮后,on_btnAdd_clicked()被调用,并发射sig_addOne信号,传递当前值。
  3. 这个信号被传递回Widget,并触发了与之连接的槽函数(lambda),最终将数值显示在主窗口的文本框中。

总结

我们通过一个简单的示例,演示了如何在Qt中跨窗口(UI)使用信号和槽进行数据传递。这个机制的关键在于:

  • 信号与槽机制提供了一种松耦合的方式,让对象之间无需直接通信即可实现信息传递。
  • 使用 lambda表达式 作为槽函数,可以让代码更加简洁,同时也方便使用局部变量。

这一机制在Qt开发中非常常见,特别是在需要跨界面传递数据或更新UI时,显得尤为重要。

如何跨线程发送信号

在Qt中如何跨线程发送信号并更新UI

在Qt中,UI线程(主线程)负责处理用户界面绘制及事件响应。而子线程的任务则通常是执行一些耗时操作,例如计算或IO操作。由于Qt的UI框架并非线程安全的,子线程不能直接更新UI,因此我们需要通过信号与槽的机制,将子线程的结果传递到UI线程,并在主线程中进行UI更新。


子线程不能直接操作UI

Qt的规则:UI只能在主线程(即UI线程)中更新,子线程(Worker Threads)不能直接操作UI。否则会引发异常或不可预知的错误。

为了解决这个问题,我们可以通过信号与槽机制,将子线程的处理结果发送到主线程,再由主线程完成UI更新。具体的实现步骤如下:

  1. 在子线程中定义并发射信号。
  2. 在主线程中通过槽函数接收信号并更新UI。

信号与槽机制在跨线程中的作用

信号与槽机制是Qt框架中核心的通信机制。它不仅适用于单线程程序,还能在线程之间进行数据的传递。在跨线程通信时,信号可以在子线程中发射,而槽函数可以在主线程中执行,因此我们可以通过这个机制在子线程与UI线程之间进行安全通信。


示例代码讲解:子线程发送信号更新UI

我们通过一个简单的例子来演示如何实现跨线程信号发送并更新UI。具体实现效果如图所示:

  • 一个按钮用于启动子线程。
  • 子线程执行一些逻辑处理后,将结果通过信号发送到主线程。
  • 主线程接收到信号后,更新界面上的QLineEdit控件。
定义子线程类 ChildThread

首先,我们定义一个子线程类 ChildThread,它继承自 QThread。在该类中,我们声明一个自定义信号 sig_SendToUI,用于将子线程的处理结果传递给主线程。

#ifndef CHILDTHREAD_H
#define CHILDTHREAD_H

#include <QThread>
#include <string>

using namespace std;

// 自定义结构体用于传递数据
struct Score
{
    int id;
    int age;
    string name;
};

class ChildThread : public QThread
{
    Q_OBJECT

public:
    ChildThread();

protected:
    void run() override; // 重写QThread的run()函数,定义线程执行逻辑

signals:
    void sig_SendToUI(Score score); // 信号:发送到UI线程
};

#endif // CHILDTHREAD_H

run() 方法中,模拟一些处理逻辑,例如设置用户的 nameidage,并在处理完成后,发射信号将数据传递给主线程。

#include "childthread.h"
#include <QDebug>

ChildThread::ChildThread()
{
    // 非基础类型参数注册
    qRegisterMetaType<Score>("Score");
}

void ChildThread::run()
{
    Score s;
    s.name = "kevin";
    s.id = 1001;
    s.age = 19;

    emit sig_SendToUI(s); // 发射信号,将Score结构体传递给主线程
}
定义主窗口类 Widget

接下来,我们定义主窗口类 Widget,其中有一个按钮用于触发子线程,一个QLineEdit用于显示子线程处理结果。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "childthread.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_btnUpdate_clicked(); // 点击按钮启动子线程
    void showInfo(Score s);      // 显示子线程传递的数据

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

on_btnUpdate_clicked() 槽函数中,我们创建并启动子线程。同时通过 connect() 将子线程的信号 sig_SendToUI 连接到主线程的槽函数 showInfo()

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include "childthread.h"

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

    // 连接按钮点击信号到槽函数
    connect(ui->btnUpdate, &QPushButton::clicked, this, &Widget::on_btnUpdate_clicked);
}

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

void Widget::on_btnUpdate_clicked()
{
    ChildThread* ch = new ChildThread(); // 创建子线程对象

    // 连接子线程信号到UI线程槽函数 showInfo
    connect(ch, &ChildThread::sig_SendToUI, this, &Widget::showInfo);

    ch->start(); // 启动子线程
}

void Widget::showInfo(Score s)
{
    // 将子线程传递的数据信息显示在lineEdit控件上
    string info = s.name + " id = " + to_string(s.id) + " age = " + to_string(s.age);
    ui->lineEdit->setText(QString::fromStdString(info));
}
  • on_btnUpdate_clicked():点击按钮后,创建并启动子线程 ChildThread,并连接信号 sig_SendToUI 到槽函数 showInfo()
  • showInfo(Score s):该槽函数接收子线程传递的 Score 结构体,并将其显示在 QLineEdit 控件上。
主程序入口 main.cpp

最后,我们编写 main.cpp 文件,启动整个应用程序。

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

代码运行结果

通过点击按钮,启动子线程,子线程完成数据处理后通过信号传递结果给主线程,主线程接收到信号后更新UI。

  • 按钮点击后,子线程发射信号,主线程接收到Score结构体后,将信息 “kevin id = 1001 age = 19” 显示在QLineEdit控件中,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

在Qt中,子线程不能直接操作UI,必须通过信号与槽机制来进行跨线程通信。在本文中,我们通过一个简单的例子详细讲解了如何通过信号与槽机制,在子线程中处理数据并将结果传递到UI线程进行更新。主要步骤包括:

  1. 定义子线程类,在子线程中发射信号。
  2. 定义主窗口类,通过槽函数接收子线程信号并更新UI。
  3. 使用connect()连接信号与槽,确保跨线程的安全通信。

通过这样的方式,我们可以轻松实现Qt中的跨线程通信,避免了线程不安全操作带来的问题。

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

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

相关文章

九APACHE

## 一 、HTTP协议与URL * HTTP协议&#xff1a;超文本传输协议&#xff0c;用于从Web服务器传输超文本到本地浏览器的传输协议&#xff0c;属于应用层协议。 超文本语言&#xff0c;用来创建超文本文件的标签 * URL&#xff1a;统一资源定位符&#xff0c;是互联网上标准资源…

centos 8.4学习小结

1.权限委派 2.vim快捷方式 2.1非正常关闭文本处理方式 2.2快捷方式 2.3TAB键补齐安装包 [ rootcloud Packages]# rpm -ivh bash-completion-2.7-5.el8.noarch.rpm 2.4#history 查询历史记录 [rootcloud ~]# vim /etc/profile HISTSIZE1000&#xff08;默认保存1000条历史记…

基于SSM的老年人身心健康监管平台

文未可获取一份本项目的java源码和数据库参考。 选题意义 21世纪是全球人口老龄化的时代。联合国经济和社会事务部人口司发布的统计数据显示&#xff0c;截止到2018年7月,全球60岁及以上人口约为9.62亿&#xff0c;占总人口的比重约为12.8%。2018年底&#xff0c;我国60岁及以…

需求11——解决字段无法清空的两个小bug

目录 背景 第一个小bug——问题阐述 第一个小bug——解决方案 第二个小bug——问题阐述 第二个小bug——解决方案 总结 背景 已经写了一个上午的文章了&#xff0c;写完这篇就可以去吃饭了。这也是这几个月的我写的最后一个小bug文章&#xff0c;把这篇文章写完就搞定了…

vue 数组变化侦测

变更方法 Vue 能够侦听响应式数组的变更方法&#xff0c;并在它们被调用时触发相关的更新。这些变更方法包括: push() pop() shift() unshift() splice() sort() reverse() <template><div><p>点击按钮为列表添加元素</p><button click"cli…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了&#xff0c;各种广告推送&#xff0c;点右上角⚙️设置&#xff0c;把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

Mybatis高级查询-一对一查询

表介绍和表关系说明 新建以下4张表 tb_user&#xff1a;用户表 tb_order&#xff1a;订单表 tb_item&#xff1a;商品表 tb_orderdetail&#xff1a;订单详情表 【表关系】 1.tb_user和 tb_order表关系tb_user 《》 tb_order&#xff1a;一对多&#xff0c; 一个人可以下多…

第 4 章 Spring IoC容器之BeanFactory

Spring 的 IoC 容器是一个提供 IoC 支持的轻量级容器&#xff0c;除了基本的 IoC 支持&#xff0c;它作为轻量级容器还提供了 IoC 之外的支持。 Spring 提供了两种容器类型&#xff1a;BeanFactory 和 ApplicationContext&#xff1a; BeanFactory&#xff0c;基础类型 IoC 容…

布隆过滤器(Bloom Filter)详解

一、引言 在处理大量数据的场景中&#xff0c;我们经常会遇到判断一个元素是否在某个集合中的问题。传统的方法可能是使用 HashMap 等集合将数据保存起来&#xff0c;然后进行比较确定&#xff0c;但在元素很多的情况下&#xff0c;这种方式会非常浪费空间&#xff0c;检索速度…

dayu_widgets-简介

前言: 越来越多的人开始使用python来做GUI程序&#xff0c;市面上却很少有好的UI控件。即使有也是走的商业收费协议&#xff0c;不敢使用&#xff0c;一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

Pytest测试用例生命周期管理-Fixture

1、Fixture 用法 Fixture 特点及优势 1&#xff64;命令灵活&#xff1a;对于 setup,teardown,可以不起这两个名字2&#xff64;数据共享&#xff1a;在 conftest.py 配置⾥写⽅法可以实现数据共享&#xff0c;不需要 import 导⼊。可以跨⽂件共享3&#xff64;scope 的层次及…

从FastBEV来学习如何做PTQ以及量化

0. 简介 对于深度学习而言&#xff0c;通过模型加速来嵌入进C是非常有意义的&#xff0c;因为本身训练出来的pt文件其实效率比较低下&#xff0c;在讲完BEVDET后&#xff0c;这里我们将以CUDA-FastBEV作为例子&#xff0c;来向读者展示如何去跑CUDA版本的Fast-BEV&#xff0c;…

动态规划算法-路径问题——LCR.166.珠宝的最高价值

1.题目解析 题目来源&#xff1a;LCR.166珠宝的最高价值 原名&#xff1a;剑指offer47.礼物的最大价值 测试用例 2.算法原理 1.状态表示 创建dp表&#xff0c;dp[i][j]表示从最左上角到该目标位置的最大礼物值&#xff0c;代表dp[i][j]的状态 2.状态转移方程 目标位置的最大礼物…

SOMEIP_ETS_178: Subscribe_using_wrong_SOMEIP_MessageID

测试目的&#xff1a; 验证DUT能够拒绝一个SOME/IP头部使用错误消息ID进行服务发现的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&#xff0c;当接收到一个使用错误消息ID的服务发现SubscribeEve…

【livox】雷达初始化成功,但没有点云(已解决)

设备&#xff1a; 一台orin&#xff08;arm&#xff09; 接网线&#xff0c;本地ip&#xff1a;192.168.1.6 livox雷达&#xff1a;HAP 雷达初始ip&#xff1a;192.168.1.100 实物如下图&#xff1a; 然后 安装 livox_SDK 和 驱动 livox_ros_driver2 参考 【Livox】安…

通信界的5G-A/F5G-A新技术,你知道多少?

2024年已经过去了一大半&#xff0c;风起云涌的AI浪潮&#xff0c;又发生了不小的变化。 一方面&#xff0c;AI大模型的复杂度不断提升&#xff0c;模型参数持续增加&#xff0c;智算集群的规模也随之增加。万卡级、十万卡级集群&#xff0c;已经逐渐成为训练标配。这对智算网络…

心觉:开发潜意识的详细流程和步骤是什么

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作195/1000天 最近领教了一下潜意识的力量和吸引力法则 我想要一张可以放在榻榻米壁柜上的迷你型的电动升降桌&#xff0c;桌面60cm…

《花100块做个摸鱼小网站! 》第七篇—谁访问了我们的网站?

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 大家好呀&#xff0c;我是summo&#xff0c;最近发生了些事情(被裁员了&#xff0c;在找工作中)导致断更了&#xff0c;非常抱歉。…

基于SpringBoot+Vue+Uniapp汽车保养系统小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…