【第二章】信号与槽——connect函数的用法

简介: 【第二章】信号与槽——connect函数的用法

信号与槽的概念

在Qt框架中,信号(Signal)与槽(Slot)是用于实现对象间通信的一种机制。它们主要用于响应事件,比如点击一个按钮会弹出一个提示。点击按钮就是事件,弹出提示就是响应这个事件的行为。

信号与槽机制是Qt框架中实现事件驱动编程的核心。它们提供了一种松耦合的方式,使对象间的通信变得简单高效。通过定义信号和槽并将它们连接起来,可以轻松地处理各种用户交互和事件响应。

  • 信号:信号是一种用来通知某些事件发生的机制。对象可以发出信号来通知其他对象某些特定的事件已经发生了。
  • :槽是一个用来响应信号的普通成员函数。槽的定义类似于普通成员函数,只不过用slots关键字标识。槽函数可以执行任何操作。

要想让信号与槽之间起作用,我们需要使用connect函数将其连接起来该连接操作通常在类的构造函数中完成,这样在特定的类对象生成的时候就会自动连接信号和槽函数。

connect函数

给出connect函数常见声明的几种方式:

旧的字符串形式

旧版本的connect函数的用法是基于字符串的。如下

static bool connect(const QObject *sender, const char *signal, 
const QObject *receiver, const char *method);
  • sender表示发送信号的对象
  • signal表示发送信号的类型,比如鼠标点击信号等
  • receiver表示接收信号的对象
  • method表示响应信号的方式

总的来说,connect函数完成了一个信号与槽的连接,回答了四个问题:谁发送的信号?发送了什么信号?发送信号给谁?怎么处理这个信号?

值得注意的是,在早期的connect函数的参数类型中,形参signal与method是一个char类型的指针,这就导致不同类型的指针要想传参就必须要进行类型转换。尤其是method作为一个函数指针,跟实际上要传参的函数指针会有较大的差异。 于是Qt设计了SIGNAL和SLOT,这两个都是宏,分别用来在使用connect传参时signal与method的类型转换。具体使用方式如下:

connect(senderObject, SIGNAL(signalName(type1, type2)), receiverObject, SLOT(slotName(type1, type2)));

此外,旧版本的槽函数也必须要声明在private slots之后,比如

在Qt5出来之后就不做硬性要求了。(slots是qt自己扩展的关键字)

我们发现其实这样传参特别麻烦。所以Qt5出来之后,把connect函数做成了一个函数模板,在实例化模板函数的时候就会自行检查传参的正确性:

基于函数指针的形式

template <typename Func1, typename Func2>
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, 
Func1 signal, const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, 
Func2 slot, Qt::ConnectionType type = Qt::AutoConnection);

使用方式如下:

connect(senderObject, &SenderClass::signalName, receiverObject, &ReceiverClass::slotName);

示例:

上述代码设计了触发提示的按钮,点击按钮之后就会弹出 "Button clicked! "

基于Lambda表达式作为槽

Qt5及以后的版本支持使用lambda表达式作为槽函数,使得代码更加简洁和灵活。

QObject::connect(&button, &QPushButton::clicked, []() {
        qDebug("Button clicked!");
    });

在这个示例中,当按钮被点击时,lambda表达式会被执行,输出“Button clicked!”。

总结

connect函数是Qt框架中一个核心的函数,用于连接信号和槽。Qt提供了多个connect函数的重载版本,用来适应不同场景的需求。

旧的字符串形式缺乏类型安全,不推荐适应使用。新的基于函数指针的形式和更加安全和简洁。推荐在Qt5及以后的版本中使用。此外,lambda表达式作为槽提供了更多的灵活性和简洁性。

相关文章
|
3天前
|
传感器 安全
第四问:QT中信号和槽原理
Qt的信号与槽机制是观察者模式的典型实现,允许对象间通信而不直接依赖。信号用于通知事件发生,槽是响应信号的函数,通过`QObject::connect()`连接。这种机制实现了松耦合、灵活扩展和自动通知,适用于UI更新和数据绑定等场景。
15 1
|
5月前
|
C++
Qt中的信号与槽如何学习?(包括自定义信号)这篇文章告诉你
以现实中的事件来举例的话,例如有两把不同颜色的信号枪,分别是红色,绿色,打响不通颜色的信号枪会触发不同的槽发生,比如说打响红色这个人就跑步,绿色就走步,但是还有一个很重要的机制,那就是连接,我们需要把信号枪去跟这个人的动作连接起来。 如果上面理解没问题的话我们可以把信号和槽看成两个工具,我们最重要的是如何去把这两个工具连接起来。 它的作用可以让我们更加灵活的去使用不同窗口间的切换以及某些事件的连接。
112 0
|
7月前
|
设计模式
【第二章】自定义信号和槽函数
【第二章】自定义信号和槽函数
|
7月前
|
JavaScript 前端开发
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`&lt;li&gt;`),实现对动态生成列表项的点击事件处理。
53 1
|
编译器 C++
【Qt】信号槽的三种连接形式
三种形式的信号槽连接,connect 语法...
157 0
《QT从基础到进阶·四》信号槽的多种连接方式
《QT从基础到进阶·四》信号槽的多种连接方式
171 0
《QT从基础到进阶·三》信号槽关联类型Connection,DirectConnection,QueuedConnection,BlockingQueuedConnection
《QT从基础到进阶·三》信号槽关联类型Connection,DirectConnection,QueuedConnection,BlockingQueuedConnection
239 0
qt信号和槽执行原理简单介绍
qt信号和槽执行原理简单介绍
154 0
|
JavaScript 前端开发 容器
Connect组件的原理是什么?
Connect组件的原理是什么?
78 0

热门文章

最新文章