一. 信号槽概念
信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号,另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt
的核心特性之一,提供了一种灵活且类型安全的方式来处理事件和数据传递。
1. 信号的本质
QT中,信号由三部分组成:
- 信号源 :哪个控件发出的信号
- 信类别 :什么类别的信号
- 信号处理方式 :通过信号处理函数,当信号被触发时执行。
2. 槽的本质
槽 本身就是一个成员函数 ,负责对QT中产生的信号进行处理。
在编写代码时,槽函数的编写等同于类的成员函数。
举例
-
有一个按钮,当点击这个按钮时,会关闭当前窗口。
-
connect(pushButton, &QPushButton::clicked, this, &MainWindow::close)
对于该例来说:- 信号源 :按钮 pushButton
- 信号类别 :点击信号 clicked
- 信号处理方式 :利用连接connect 与槽函数slot(即close)进行处理
3.信号与槽的连接类型
-
Qt::AutoConnection
默认值,使用这个值则连接类型会在信号发送时决定。
如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。
如果接收者和发送者不在同一个线程,则自动使用Qt::QueuedConnection类型。 -
Qt::DirectConnection
槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成崩溃。 -
Qt::QueuedConnection
槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。 -
Qt::BlockingQueuedConnection
槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。 -
Qt::UniqueConnection
这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。
4. 标准信号槽
即 Qt框架 中内置的信号槽:
Qt框架中,存在一些标准信号(Standard Signals)和标准槽(Standard
Slots)的已定义信号和槽函数。这些标准信号和槽提供了一些常见的功能,可以在不同的Qt对象之间进行连接。
- 标准信号如:QPushButton、QLineEdit、QSlider等。
- 标准槽如:对于QWidget,有show()、hide()、close()等。
5. 信号槽 实例
我们尝试写一个关闭窗口按钮 :
举例
我们将使用的标准信号 以及 槽函数:
// 单击按钮后发出的信号
[signal] void QAbstractButton::clicked(bool checked = false)
// 关闭窗口的槽函数
[slot] bool QWidget::close();
我们需要在main

最低0.47元/天 解锁文章
1606

被折叠的 条评论
为什么被折叠?



