3.QT-信号和槽|自定义槽函数|自定义信号}自定义的语法}带参数的信号和槽(C++)

QT(C++)面试核心:从C++内存管理到QT信号槽与多线程实战 C++作为高性能系统编程语言,其核心在于对内存和资源的精细控制,而面向对象与多态特性则通过虚函数表等机制实现运行时灵活性。在GUI开发领域,这些底层原理与框架机制结合,催生了如QT这样的跨平台应用框架。QT框架的核心价值在于其独特的信号与槽机制和基于事件循环的异步编程模型,这极大地简化了响应式用户界面的开发。信号与槽通过元对象系统实现类型安全的松耦合通信,而事件循环则统一管理用户输入、定时器及跨线程消息,是GUI流畅响应的基础。在多线程场景下,结合C++的智能指针与QT的线程模型,开发者能构建出既高效又稳定 阅读详情

信号和槽

Linux信号 Signal 系统内部的通知机制. 进程间通信的方式.

  1. 信号源:谁发的信号.
  2. 信号的类型:哪种类别的信号
  3. 信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行.

Qt中的信号和Linux中的信号,虽然不是一样的概念,但是确实有相似之处

Qt中,谈到信号,也是涉及到三个要素信号源:

  1. 由哪个控件发出的信号
  2. 信号的类型:用户进行不同的操作,就可能触发不同的信号
  • 点击按钮,触发点击信号.
  • 在输入框中移动光标,触发移动光标的信号,勾选一个复选框
  • 选择一个下拉框都会触发出不同的信号
    咱们写的GUI程序,就是要让用户进行操作.就是要和用户进行交互这个过程中就需要关注,用户当前的操作具体是个什么样的操作
  1. 信号的处理方式:槽(slot)=>函数
    Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来后续只要信号触发了,Qt就会自动的执行槽函数

所谓的"槽函数"本质上也是一种"回调函数"(callback)
最早C语言阶段
C 进阶=>指针进阶=>函数指针.

  1. 实现转移表,降低代码的"圈复杂度”.
  2. 实现回调函数效果=〉qsort

后来在C++阶段~

  1. STL中,函数对象/仿函数
  2. lambda 表达式.

后来在Linux中

  1. 信号处理函数
  2. 线程的入口函数.
  3. epoll基于回调的机制

一定是先把信号的处理方式准备好,再触发信号~
Qt中,一定是先关联号信号和槽,然后再触发这个信号.顺序不能颠倒,否则信号就不知道如何处理了(错过了).

信号和槽概述

在Qt中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如"⽤⼾点击按钮"是⼀个事件,"⽤⼾关闭窗⼝"也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出"按钮被点击"的信号,⽤⼾关闭窗⼝会发出"窗⼝被关闭"的信号。
Qt中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到"按钮被点击"的信号后,会做出"关闭⾃⼰"的响应动作;再⽐如输⼊框⾃⼰接收到"输⼊框被点击"的信号后,会做出"显⽰闪烁的光标,等待⽤⼾输⼊数据"的响应动作。在Qt中,对信号做出的响应动作就称之为槽。
信号和槽是Qt特有的消息传输机制,它能将相互独⽴的控件关联起来。⽐如,"按钮"和"窗⼝"本⾝是两个独⽴的控件,点击"按钮"并不会对"窗⼝"造成任何影响。通过信号和槽机制,可以将"按钮"和"窗⼝"关联起来,实现"点击按钮会使窗⼝关闭"的效果。
![[Pasted image 20250417183130.png]]

信号的本质

信号是由于⽤⼾对窗⼝或控件进⾏了某些操作,导致窗⼝或控件产⽣了某个特定事件,这时Qt对应的窗⼝类会发出某个信号,以此对⽤⼾的操作做出反应。因此,信号的本质就是事件。如:

  • 按钮单击、双击
  • 窗⼝刷新
  • ⿏标移动、⿏标按下、⿏标释放
  • 键盘输⼊
    那么在Qt中信号是通过什么形式呈现给使⽤者的呢?
  • 我们对哪个窗⼝进⾏操作,哪个窗⼝就可以捕捉到这些被触发的事件。
  • 对于使⽤者来说触发了⼀个事件我们就可以得到Qt框架给我们发出的某个特定信号。
  • 信号的呈现形式就是函数,也就是说某个事件产⽣了,Qt框架就会调⽤某个对应的信号函数,通知使⽤者。
    在Qt中信号的发出者是某个实例化的类对象。
槽的本质

槽(Slot)就是对信号响应的函数。槽就是⼀个函数,与⼀般的C++函数是⼀样的,可以定义在类的任何位置(public、protected或private),可以具有任何参数,可以被重载,也可以被直接调⽤(但是不能有默认参数)。槽函数与⼀般的函数不同的是:槽函数可以与⼀个信号关联,当信号被发射时,关联的槽函数被⾃动执⾏。
说明
(1)信号和槽机制底层是通过函数间的相互调⽤实现的。每个信号都可以⽤函数来表⽰,称为信号函数;每个槽也可以⽤函数表⽰,称为槽函数。例如:"按钮被按下"这个信号可以⽤clicked()函数表⽰,"窗⼝关闭"这个槽可以⽤close()函数表⽰,假如使⽤信号和槽机制-实现:"点击按钮会关闭窗⼝"的功能,其实就是clicked()函数调⽤close()函数的效果。
(2)信号函数和槽函数通常位于某个类中,和普通的成员函数相⽐,它们的特别之处在于:

  • 信号函数⽤signals关键字修饰,槽函数⽤public slots、protected slots 或者private slots修 饰。signals和slots是Qt在C++的基础上扩展的关键字,专⻔⽤来指明信号函数和槽函数;
  • 信号函数只需要声明,不需要定义(实现),⽽槽函数需要定义(实现)。
    信号函数的定义是Qt⾃动在编译程序之前⽣成的.编写Qt应⽤程序的程序猿⽆需关注.
    这种⾃动⽣成代码的机制称为元编程(Meta Programming).这种操作在很多场景中都能⻅到.

信号和槽的使⽤

连接信号和槽

在Qt中,QObject类提供了⼀个静态成员函数connect(),该函数专⻔⽤来关联指定的信号函数和槽函数
QObject是Qt内置的⽗类.Qt中提供的很多类都是直接或者间接继承⾃QObject.

connect()函数原型:

connect (const QObject *sender,  
		const char * signal ,  
		const QObject * receiver ,  
		const char * method ,  
		Qt::ConnectionType type = Qt::AutoConnection )

参数说明:

  • sender:信号的发送者;(哪个控件)
  • signal:发送的信号(信号函数);(信号的类型)
  • receiver:信号的接收者;(控件)
  • method:接收信号的槽函数;(要处理信号的对象提供的成员函数)
  • type:⽤于指定关联⽅式,默认的关联⽅式为Qt::AutoConnection,通常不需要⼿动设定

代码⽰例:在窗⼝中设置⼀个按钮,当点击"按钮"时关闭"窗⼝"。

#include "widget.h"
#include "ui_widget.h"
  
#include <QPushButton>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    QPushButton* button = new QPushButton(this);
    button->setText("关闭");
    button->move(200, 200);
  
    connect(button, &QPushButton::clicked, this, &Widget::close);
}
  
Widget::~Widget()
{
    delete ui;
}

所谓的信号也就是Qt中的对象,内部提供的一些成员函数
![[Pasted image 20250417185911.png]]

图标带有锯齿,slot函数,click是一个slot函数,作用就是在调用的时候相当于点击了一下按钮
带有类似wifi的图标,就是信号函数,clicked,才是要触发的点击信号

button, &QPushButton::clicked

connect函数要求,这俩参数是匹配的,button的类型如果是QPushButton*,此时第二个参数的信号必须是QPushButton内置的信号或者父类的信号,不能是其他的类的信号

this, &Widget::close

close是QWidget内置的槽函数,Widget继承自QWidget,也就继承了父亲的槽函数
close槽函数功能已经是内部实现好的,具体作用就是关闭当前的窗口/控件

connect(button, &QPushButton::clicked, this, &Widget::close);

针对button,进行点击操作,Widget就会关闭
![[Pasted image 20250417194027.png]]

具体可以查看Qt文档
![[Pasted image 20250417194426.png]]

connect中的char*参数
但是传入的是&QPushButton::clicked, &Widget::close函数指针
![[Pasted image 20250417201211.png]]

void(*)();
![[Pasted image 20250417201234.png]]

bool(*)();
这两个函数指针的类型也是不同的
![[Pasted image 20250417201402.png]]

这个函数声明,是以前l日版本的Qt的connect函数的声明
以前版本中,传参的写法和现在其实也是有区别的此时,给信号参数传参,要搭配一个SIGNAL宏. 给槽参数传参,搭配一个SLOT宏.
传入的函数指针转成char*

connect(button, SIGNAL(&QPushButton::clicked), this, SLOT(&Widget::close));

Qt 5开始,对上述写法做出了简化.不再需要写SIGNAL 和SLOT宏了.
给connect提供了重载版本.重载版本中,第二个参数和第四个参数成了泛型参数.允许咱们传入任意类型的函数指针了.
![[Pasted image 20250417201637.png]]

QtPrivate::FunctionPointer<Func1>::ObjectQt封装的类型萃取器
此时connect函数就带有了一定的参数检查功能
如果你传入的第一个参数和第二个参数不匹配,或者第三个参数和第四个参数不匹配.(不匹配,2,4参数的函数指针,不是1,3 参数的成员函数)
此时代码编译出错

自定义槽函数1

widget.cpp

#include "widget.h"
#include "ui_widget.h"
  
#include <QPushButton>
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    button->move(100, 100);
  
    connect(button, &QPushButton::clicked, this, &Widget::handleClicked);
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handleClicked()
{
    //按下按钮,修改窗口标题
    this->setWindowTitle("按钮已经按下");
}

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();
  
    void handleClicked();
  
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

![[Pasted image 20250417202721.png]]

按下按钮
![[Pasted image 20250417202729.png]]

所谓的slot就是一个普通的成员函数
所谓的自定义一个槽函数,操作过程和自定义一个普通的成员函数,没啥区别!在以前版本的Qt中,槽函数必须放到public/private/protected slots:
![[Pasted image 20250417203313.png]]

此处的slots是Qt自己扩展的关键字.(不是C++标准中的语法) Qt里广泛使用了元编程技术. (基于代码,生成代码)
qmake 构建Qt项目的时候,就会调用专门的扫描器,扫描代码中特定的关键字.(slots这种) 基于关键字自动生成一大堆相关的代码,

自定义槽函数2

图形化方式拖入一个PushButton
![[Pasted image 20250417203641.png]]

鼠标右键点击PushButton
![[Pasted image 20250417203929.png]]

点击转到槽
![[Pasted image 20250417203939.png]]

这个窗口列出了QPushButton提供的所有信号,包含了QPushButton父类的信号
双击clicked
![[Pasted image 20250417204153.png]]

直接生成好了一个函数,声明也生成好了
可以直接编写代码

void Widget::on_pushButton_clicked()
{
    this->setWindowTitle("按钮已经按下");
}

![[Pasted image 20250417204315.png]]

在Qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接

void Widget::on_pushButton_clicked()

⾃动⽣成槽函数的名称有⼀定的规则。槽函数的命名规则为:on_XXX_SSS,其中:

  1. 以"on"开头,中间使⽤下划线连接起来;
  2. "XXX"表⽰的是对象名(控件的 objectName 属性)。
  3. "SSS"表⽰的是对应的信号。
    如:“on_pushButton_clicked()”,pushButton代表的是对象名,clicked是对应的信号。
    ![[Pasted image 20250417205652.png]]

Qt中调用这个函数的时候,就会触发上述自动连接信号槽的规则!!正是在自动生成的ui_widget.h中调用的~
![[Pasted image 20250417205720.png]]

如果我们通过图形化界面创建控件,还是推荐使用这种快速的方式来连接信号槽
如果我们是通过代码的方式来创建控件,还是得手动connect.(你的代码中没有调用connectSlotsByName)

自定义信号

Qt中也充许自定义信号
自定义槽函数,非常关键.开发中大部分情况都是需要自定义槽函数的槽函数,就是用户触发某个操作之后,要进行的业务逻辑
自定义信号,比较少见.实际开发中很少会需要自定义信号.
信号就对应到用户的某个操作~
在GUI,用户能够进行哪些操作,是可以穷举的~~
Qt内置的信号,基本上已经覆盖到了上述所有可能的用户操作
因此,使用Qt内置的信号,就足以应付大部分的开发场景了,
自定义信号,本身代码比较简单的~
![[Pasted image 20250417211348.png]]

Widget虽然还没有定义任何信号,由于继承自QWidget,和QObject,这俩类里面已经提供了一些信号了,可以直接使用.
所谓的Qt的信号,本质上也就是一个"函数
Qt5以及更高版本中,槽函数和普通的成员函数之间,没啥差别了. 但是,信号,则是一类非常特殊的函数,

  1. 程序员只要写出函数声明,并且告诉Qt,这是一个“信号”即可, 1.
    这个函数的定义,是Qt在编译过程中,自动生成的.(自动生成的过程,程序员无法干预)
    信号在Qt中是特殊的机制.Qt生成的信号函数的实现,要配合Qt框架做很多既定的操作~~
  2. 作为信号函数,这个函数的返回值,必须是void.
    有没有参数都可以.甚至也可以支持重载
    ![[Pasted image 20250417211440.png]]

这个也是Qt自己扩展出来的关键字~~
qmake的时候,调用一些代码的分析/生成工具,
扫描到类中包含signals这个关键字的时候,此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义
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();
signals:
    void mySignal();
public slots:
    void handleMySignal();
  
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this, &Widget::mySignal, this, &Widget::handleMySignal);

    //发送自定义信号
    emit mySignal();
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handleMySignal()
{
    this->setWindowTitle("处理自定义信号");
}

如何才能触发出自定义的信号呢?
Qt内置的信号,都不需要咱们手动通过代码来触发
用户在GUI,进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置到Qt框架中了)
自定义的信号需要通过emit,来发射信号

emit mySignal();

![[Pasted image 20250417212346.png]]

在启动的时候直接触发信号
发送信号的操作,可以在任何合适的代码中,不一定非要在构造函数中

#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
  
    connect(this, &Widget::mySignal, this, &Widget::handleMySignal);
  
  
}
  
Widget::~Widget()
{
    delete ui;
}
  
void Widget::handleMySignal()
{
    this->setWindowTitle("处理自定义信号");
}
  
  
void Widget::on_pushButton_clicked()
{
    //发送自定义信号
    emit mySignal();
}

通过图形化方式创建一个槽函数
![[Pasted image 20250417212730.png]]

点击按钮
![[Pasted image 20250417212736.png]]

点击按钮->
QPushButton::clicked->
Widget::on_pushButton_clicked()->
emit mySignal();->
void Widget::handleMySignal()

其实在Qt5中emit 现在啥都没做
真正的操作都包含在mySignal内部生成的函数定义了
emit mySignal();
即使不写emit,信号也能发出去!!
即使如此,实际开发中,还是建议大家,把emit都加上
加上代码可读性更高,更明显的标识出,这里是发射自定义的信号了.

自定义的基本语法

在Qt中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的
信号函数和槽函数有⼀定的书写规范。
1、⾃定义信号函数书写规范

  1. ⾃定义信号函数必须写到"signals"下;
  2. 返回值为void,只需要声明,不需要实现;
  3. 可以有参数,也可以发⽣重载;

2、⾃定义槽函数书写规范

  1. 早期的Qt版本要求槽函数必须写到"public slots"下,但是现在⾼级版本的Qt允许写到类的"public"作⽤域中或者全局下;
  2. 返回值为void,需要声明,也需要实现;
  3. 可以有参数,可以发⽣重载;

3、发送信号
使⽤"emit"关键字发送信号。"emit"是⼀个空的宏。"emit"其实是可选的,没有什么含义,只是为了提醒开发⼈员。

![[Pasted image 20250417213623.png]]

必须先关联再发射
原因是,⾸先关联信号和槽,⼀旦检测到信号发射之后就会⽴⻢执⾏关联的槽函数。反之,若先发射信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应

带参数的信号和槽

Qt的信号和槽也⽀持带有参数,同时也可以⽀持重载.
此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致.
此时信号触发,调⽤到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参当中

signals:
    void mySignal(const QString& text);
  
public slots:
    void handleMySignal(const QString& text);

这里的参数必须一致
一致主要是要求类型一致,个数如果不一致也可以,不一致的时候,信号的参数的个数必须比槽的参数的个数更多

void Widget::handleMySignal(const QString& text)
{
    this->setWindowTitle(text);
}
  
  
void Widget::on_pushButton_clicked()
{
    //发送自定义信号
    emit mySignal("带参数的信号");
}

![[Pasted image 20250417215916.png]]

点击按钮
![[Pasted image 20250417215923.png]]

传参可以起到复用代码的效果
有多个逻辑,逻辑上整体一致,但是涉及到的数据不同,
就可以通过函数-参数来复用代码,并且在不同的场景中传入不同的参数即可~
![[Pasted image 20250417220231.png]]

新建一个PushButton
转到槽,新建一个clicked函数

void Widget::on_pushButton_clicked()
{
    //发送自定义信号
    emit mySignal("把标题设置为标题1");
}
  
void Widget::on_pushButton_2_clicked()
{
    emit mySignal("把标题设置为标题2");
}

![[Pasted image 20250417220435.png]]

![[Pasted image 20250417220440.png]]

通过这一套信号槽,搭配不同的参数,就可以起到设置不同标题的效果

Qt中很多内置的信号,也是带有参数的.(这些参数不是咱们自己传递的)
clicked信号就带有一个参数~~
![[Pasted image 20250417221013.png]]

这个参数表示当前按钮是否处于“选中”状态这个选中状态对于QPushButton没啥意义,对于QCheckBox复选框,就很有用了,

signals:
    void mySignal(const QString& text, const QString& text2);
  
public slots:
    void handleMySignal(const QString& text);
void Widget::on_pushButton_clicked()
{
    //发送自定义信号
    emit mySignal("把标题设置为标题1", "");
}
  
void Widget::on_pushButton_2_clicked()
{
    emit mySignal("把标题设置为标题2", "");
}

信号函数的参数个数,超过了槽函数的参数个数,此时,都是可以正常使用的信号函数的参数个数,少于槽函数的参数个数,此时代码无法编译通过
![[Pasted image 20250417222042.png]]

直观的思考,应该是要求信号的参数个数和槽的参数个数,严格一致
此处为啥允许信号的参数比槽的参数多呢?? 一个槽函数,有可能会绑定多个信号
如果我们严格要求参数个数一致,就意味着信号绑定到槽的要求就变高了,
换而言之,当下这样的规则,就允许信号和槽之间的绑定更灵活了,更多的信号可以绑定到这个槽函数上了,
个数不一致,槽函数就会按照参数顺序,拿到信号的前N个参数
至少需要确保,槽函数的每个参数都是有值的
要求信号给槽的参数,可以有富裕,但是不能少
![[Pasted image 20250417222334.png]]

![[Pasted image 20250417222340.png]]

![[Pasted image 20250417222418.png]]

带有参数的信号,要求信号的参数和槽的参数要一致
类型,个数要满足要求(信号的参数个数要多于槽的参数个数).

widget.h
![[Pasted image 20250417222531.png]]

Qt中如果要让某个类能够使用信号槽(可以在类中定义信号和槽函数)
则必须要在类最开始的地方,写下QOBJECT宏
这个宏能展开成很多额外的代码
![[Pasted image 20250417222727.png]]

如果不加这个宏,这个类编译的时候会报错

QPushButton 详解(C++) 继承自,属于 Qt Widgets 模块,主要用于响应用户的点击操作。显示文本标签(如“确定”“取消”);显示图标(支持 PNG、SVG 等格式);触发点击事件(clicked()信号);支持不同状态(正常、按下、禁用等);可自定义外观(通过样式表或绘图事件)。通过// 正常状态" // 背景色" // 文本色" // 圆角" // 内边距"}"// 悬停状态"}"// 按下状态" // 按下时轻微下移"}"); 阅读详情

相关推荐

QT(C++)面试核心:从内存管理到跨平台架构的实战复盘

在C++应用开发领域,内存管理是构建稳定、高效程序的基石,涉及从基础语法到资源生命周期的系统理解。其核心原理在于通过RAII(资源获取即初始化)等范式,确保资源的安全分配与释放,从而避免泄漏与悬空指针。这一技术价值在大型桌面应用、工业软件及嵌入式系统中尤为凸显,直接决定了软件的可靠性与性能。在实际应用场景中,开发者常需处理多线程环境下的对象生命周期、GUI框架的自动回收机制等复杂问题。本文基于高频面试考点,深入探讨了QT框架中对象树与智能指针的协同工作方式,并解析了信号槽机制如何实现跨线程安全通信,为应对企

weixin_34007886的博客 391

从零开始:用Qt信号与槽实现一个简易聊天程序(Qt5/C++)

本文详细介绍了如何使用Qt信号与槽机制从零开发一个简易聊天程序。通过Qt5/C++实现,涵盖基础连接、高级应用技巧、完整功能实现及性能优化,帮助开发者掌握Qt核心特性并应用于实际项目开发。

weixin_42553471的博客 327

QT学习笔记

QT学习笔记

weixin_52938172的博客 1493

Qt学习笔记-自定义信号与槽函数

简介 信号与槽:信号可以看成一个邮件,槽就是里面的讯息 槽对接受者而言是命令 一般来说,信号和槽要通过connect函数连接后发挥作用 对于一个非自定义的信号连接 假设我已在Widget类(继承于QWidget)里定义 QPushbutton b1; QPushbutton b2;1 connect(&b1,&QPushbutton::pressed,&b2,&QP...

prqoppqpr的博客 931

2024年Qt开发实战指南:从核心概念到工业级应用

在C++ GUI开发领域,信号与槽机制和模型/视图架构是构建复杂、高性能桌面应用的核心技术。信号与槽提供了一种类型安全、松耦合的对象间通信方式,有效解决了传统回调函数在异步编程和组件通信中的复杂性。模型/视图架构则将数据与显示逻辑分离,使得同一份数据能以多种视图呈现,极大提升了代码的可维护性和复用性。这些机制共同构成了Qt框架的技术基石,使其在工业控制、嵌入式HMI、汽车仪表和医疗器械等对性能、稳定性和跨平台能力有严苛要求的领域展现出不可替代的价值。本文基于最新的Qt 6.6 LTS版本,深入解析这些核心概

weixin_30654583的博客 376

别再只用真彩色了!手把手教你用ENVI主成分分析(PCA)给遥感图像‘美颜’与‘瘦身’

本文详细介绍了如何利用ENVI主成分分析(PCA)技术优化遥感图像处理,实现数据‘美颜’与‘瘦身’。通过PCA的维度压缩、噪声分离和特征增强三大优势,显著提升高光谱数据的可视化效果和分析效率。文章还提供了ENVI操作的最佳实践和常见问题解决方案,帮助读者掌握这一遥感图像处理的游戏规则改变者。

weixin_28465009的博客 276

Qt自定义信号和槽函数

Qt自定义信号和槽函数 实际开发中,如果仅使用 Qt 提供的信号函数和槽函数,会经常遇到信号函数的参数类型和个数无法满足实际需求、信号函数和槽函数的参数类型不匹配等问题。解决此类问题,最简单有效的方式就是:自定义场景需要的信号函数和槽函数。 自定义信号函数 信号函数指的是符合以下条件的函数: 定义在某个类中,该类直接或间接继承自 QObject 类; 用 signals 关键字修饰; 函数只需要声明,不需要定义(实现); 函数的返回值类型为 void,参数的类型和个数不限。 举个简单的例子: class M

ccc369639963的博客 4752

SAP 对接CBS(http方式)

CLEAR:lv_xml_crc32_string. CONCATENATEcrc32_passwordcrc32_keyi_stringINTOlv_xml_crc32_string. CONDENSElv_xml_crc32_string. CALLFUNCTION'SCMS_STRING_TO_XSTRING' EXPORTING text=lv_xml_crc32_string encoding='8400' "GB...

3597

二、自定义信号和槽

1. 自定义槽 槽可以是任何成员函数、普通全局函数、静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: public slots: void mySlot(); 之后在mainwidget.cpp文件中定义槽函数: void MainWidget::mySlot() { b2->setText("^_^"); } 现在, 我们希望当Button2按下时, Button2显示的文本变成笑脸,

qq_38231713的博客 1371

保姆级避坑指南:在Ubuntu 18.04上搞定速腾Helios雷达驱动与fast-LIO2的完整配置流程

本文提供了一份详细的速腾Helios雷达与fast-LIO2在Ubuntu 18.04上的配置避坑指南,涵盖驱动安装、数据格式转换到建图全流程。特别针对常见编译错误和数据转换问题提供了解决方案,帮助开发者高效完成环境搭建与建图任务。

weixin_27252001的博客 113

springboot+shardingsphere+druid 实现基于时间的水平分表

使用shardingsphere基于时间字段的动态水平分片。

weixin_42207940的博客 2627

学习信号和槽(2)

自定义slot和普通的成员函数没有什么区别。Qt5自定义槽函数的方法以前的Qt版本,自定义槽函数的方法()此处的slots是Qt自己扩展的关键字(不是c++标准中的语法)自定义槽函数方式二:(快速的方式)通过ui设计界面里,拖动一个控件到窗口,然后右键弹出对话框,点击“转到槽”,然后选择信号,就会生成自定义槽函数,并且与该槽函数建立连接。(无需用connect进行连接)运行程序:实现槽函数自动连接如果我们通过图形化界面的方式创建控件,此时就会推荐快速的方式来连接信号槽。

plj521的博客 1959

Fat-Tree Topo Architecture(胖树拓扑结构)

背景 最近在搜索关于Fat-Tree的相关资料时,发现网上内容比较少,很多博客是相互转载的,拓扑结构图也加载不出来,使得对Fat-Tree的理解过于抽象。 实践 传统数据中心采用多层级的树形结构,这种结构针对客户端/服务器(C/S)模式能有较好的效果。树形结构包括单根树和多根树。多根数的根节点往往作为备份节点存在(我们以方格代表交换机)。 传统单根/多根拓扑结构有以下缺点:成本高,根部交换机必须要有足够大的带宽来满足下层服务器之间的通信;性能瓶颈,无法满足数据中心内部大规模的MapReduce和数据拷贝。

金色牛神的专栏 3万+

QT学习笔记(四)信号槽与简单的自定义信号

了解信号槽,并实现简单的自定义信号

weixin_42730271的博客 1178

六、大模型(LLMs)参数高效微调(PEFT) 面

链接: https://pan.baidu.com/s/1TYqdCK53tDFEYGtAvpnTbA 提取码: 6a9s。考核中的核心考点,并针对这些考点提供了详尽的解答。通过网盘分享的文件:06大模型(LLMs)参数高效微调(PEFT) 面。)有哪些方法,能不能稍微介绍一下它们间?这种微调方法和全参数比起来有什么劣势吗?能不能总结一下各种参数高效微调方法?高效参数微调,如何进行存储?多种不同的高效微调方法对比。模型显存占用的部分有哪些?微调方法为啥能加速训练?微调计算可训练参数的比例。

weixin_51988935的博客 534

Python 爬虫实战:华尔街见闻精选文章爬取(反反爬 + 投资情绪分析)

Python 爬虫实战:华尔街见闻精选文章爬取(反反爬 + 投资情绪分析)

yansideyucsdn的博客 970

QT(C++)面试总结

参考博客 QT信号槽机制的优缺点 (1)问题: 为什么Qt使用信号与槽机制而不是传统的回调函数机制进行对象间的通信呢? 回调函数的本质是“你想让别人的代码执行你的代码,而别人的代码你又不能动”这种需求下产生的。 回调函数是函数指针的一种用法,如果多个类都关注某个类的状态变化,此时需要维护一个列表,以存放多个回调函数的地址。对于每一个被关注的类,都需要做类似的工作,因此这种做法效率低,不灵活。 (2)解决办法 Qt使用信号与槽机制来解决这个问题,程序员只需要指定一个类含有哪些信号函数、哪些槽函数,Qt会处理信

qq_40433783的博客 2万+

RK3588芯片USB OTG模式切换:Device到Host的驱动奥秘之旅

摘要:本文详细介绍了RK3588芯片USB OTG模式从Device到Host的完整驱动流程,包括硬件电路设计、内核驱动配置、模式切换机制及验证方法。RK3588芯片凭借强大的性能和灵活的USB OTG特性,在工业控制、智能家居等领域具有广泛应用前景。文章重点分析了Type-C接口设计、USBPHY芯片选型、Linux内核模块配置等关键技术要点,并提供了模式切换脚本使用方法和常见问题解决方案,为开发者实现RK3588 USB OTG功能提供了全面指导。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 740

Qt(c++)入门知识总结

qt(c++) 基础总结

weixin_45054115的博客 7415

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Qt学习记录(C++)——Day 1

Qt是一个由Qt Company于1991年开发的跨平台C++图形用户界面(GUI)应用程序开发框架。它不仅可用于开发GUI程序,还可以用于开发非GUI程序,如控制台工具和服务器。Qt是一个面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器,moc)和一些宏,使得Qt易于扩展并允许真正的组件编程。Qt拥有广泛的开发功能,包括多线程、数据库、图像图形处理、音视频处理、网络通信、文件IO等。

热爱编程小枫的博客 1414

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

QT Quick(C++)跨平台应用程序项目实战教程 4 — QML基本使用方法

本章内容介绍QML的基本使用方法。

你是怎么做到的?我为什么做不到 2109

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Qt QML and Qt Quick 简述及例程

本文介绍了Qt QML和Qt Quick的核心概念及基本应用。QML是一种声明式语言,用于设计用户界面,具有简洁语法、数据绑定和跨平台支持等特点。Qt Quick是基于QML的框架,提供预定义UI组件和硬件加速渲染。文章详细阐述了QML与C++的交互方式,包括属性绑定、信号槽机制和类型注册。同时提供了三个示例:创建Qt Quick应用、实现QML与C++信号槽数据传输,以及测试不同参数类型的信号传递。

做减求空 1358

Qt嵌入式GUI开发实战:从信号槽机制到i.MX6平台部署全解析

在嵌入式系统开发中,图形用户界面(GUI)框架的选择直接影响开发效率和跨平台兼容性。信号与槽机制作为Qt框架的核心通信原理,通过类型安全的松耦合设计,实现了对象间的高效事件驱动通信,取代了传统的回调函数模式。这一机制不仅支持一对多、多对一的灵活连接,更内置了跨线程安全处理,为嵌入式多线程应用开发提供了坚实基础。其技术价值在于显著提升了代码的可维护性和模块复用性,尤其适用于工业控制、物联网设备等需要复杂交互的嵌入式场景。结合基于QObject的对象树内存管理模型,开发者能够有效避免内存泄漏,将精力集中于业务逻

weixin_30820077的博客 412

QT系列(一)

是一个跨平台的C++应用程序开发框架具有短平快的优秀特质: 投资少、周期短、见效快、效益高几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发有属于自己的事件处理机制可以搞效率的开发基于窗口的应用程序Qt是标准 C++ 的扩展, C++的语法在Qt中都是支持的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,可以快速上手Qt 提供了一种称为 signals/slots 的安全类型来替代 callback(回调函数),这使得各个元件 之间的协同工作变得十分简单。

m0_57794197的博客 2216

Qt Quick 和 Widgets 的对比

Qt Quick 和 Widgets 的对比 概念: Qt Quick : QML 类型 和 功能的标准库 Qt Quick 模块:提供可视化组件,模型视图支持,动画框架以及用于构建用户界面的更多功能。 Qt Quick Controls :基于Qt Quick 的可重用UI组件库。 Qt Quick1 基于Graphics View Qt Quick2 基于Scene Graph 的技术 ,独立的渲染线程 QML(前端开发,后端还是C++): Qt Meta-Object Language 声明..

qq_41607336的博客 3510
上一篇: NO.96十六届蓝桥杯备战|图论基础-多源最短路|Floyd|Clear And Present Danger|灾后重建|无向图的最小环问题(C++)
下一篇: 4.QT-信号和槽|存在意义|信号和槽的连接方式|信号和槽断开|lambda表达式|信号和槽优缺点(C++)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值