本节对应的视频讲解:B_站_链_接
https://www.bilibili.com/video/BV1vW4y1676Q
本节讲解信号和槽的概念,以及标准的信号槽
1. 什么是信号槽
1.1 信号
首先看一下什么是事件和信号
以 QPushButton
的单击事件为例:
按下按钮,会触发 mousePressEvent
事件,然后 QPushButton 会发射 pressed()
信号;
松开按钮,会触发 mouseReleaseEvent
事件,然后 QPushButton 会发射 released()
信号和 clicked()
信号
常用的事件有很多,比如鼠标的单击和双击事件,鼠标的移动事件,键盘的输入事件等。事件会专门在后边进行讲解
当某个实例化的对象上产生这些事件时,该实例化对象就会发出特定的信号。
信号的本质就是函数,并且是只需声明,无需实现的函数
具体一个类有哪些信号,可以查看 Qt 的帮助文档,以 QPushButton
为例:
首先打开 QPushButton
的帮助说明:
接着,跳转到其父类 QAbstractButton
,这里就有信号了,如下:
点击【Signals】可以跳转到信号处,如下:
可以点击对应的链接,查看详细说明
这里总结如下:
// 当按钮被点击(按下并抬起)之后,发送该信号,其中带有一个默认参数
// 对于QPushButton 通常不需要传递这个默认参数
// 对于可选中/取消选中的按钮,比如复选框QCheckBox、单选框QRadioButton 可以通过该参数,获取其是否选中
void clicked(bool checked = false);
// 当按钮被按下时,发送该信号
void pressed();
// 当按钮被抬起时,发送该信号
void released();
// 当按钮状态改变时,发送该信号,其中带有一个参数checked
// checked 用于标识复选框QCheckBox、单选框QRadioButton是否被选中
void toggled(bool checked);
由于这是我们第一次接触信号和槽,所以这里讲解的比较细致。以后遇到其他类的信号和槽,就按照这个方法来查阅即可。
1.2 槽
我们通常说的 槽,就是槽函数
当点击了 QPushButton
按钮之后,通常需要执行对应的操作,比如让 QMainWindow
窗口最大/最小/正常化显示,或者关闭窗口
按照以上查看信号的方法,查看 QMainWindow
提供了哪些槽函数,同样跳转到其父类 QWidget
中查看,如下:
可以点击对应的链接,查看详细说明,比如:
// 最大化显示
void showMaximized();
// 最小化显示
void showMinimized();
// 正常显示
void showNormal();
// 关闭窗口
bool close();
讲解了信号和槽之后,如何实现如下效果呢?
效果:点击按钮后,实现窗口的最大/最小/正常显示,或者关闭窗口。
答:这就需要将信号和槽使用 connect
函数进行连接
比如将 QPushButton 按钮的 clicked()
信号和 QMainWindow 窗口的 close()
槽函数建立连接之后,当点击了 QPushButton 按钮后,Qt 框架就
会自动调用 QMainWindow 窗口的 close()
槽函数,从而实现窗口的关闭。
connect
方法是 QObject
类的静态方法,它有多个重载的方法,如下:
Qt4 和 Qt5 中连接信号和槽的方法略有不同,后面会详细说明。
不过总的来说,connect
函数的一般形式如下:
connect(sender, signal, receiver, slot);
其中:
-
sender
发出信号的对象。比如 QPushButton 按钮 -
signal
发出的信号。比如 clicked() -
receiver
接收信号的对象。比如 QMainWindow 窗口 -
slot
接收到信号之后,调用的函数
一句话总结:信号槽是对象之间的信息通讯的方式
2. 标准信号槽的使用
这里以一个实际的案例,来演示信号和槽的使用
案例:点击对应按钮,实现窗口的最大化/最小化/正常显示窗口,和关闭窗口
2.1 新建工程
按照之前的讲解,一步步新建一个窗口工程
2.2 界面布局
- 放置按钮并布局
放置4个按钮;
选中窗口,点击工具栏的【水平布局】,进行布局(这样可以对齐并且自适应窗口大小的变化);
在左右两侧各放一个Horizontal Spacer
(避免按钮太大,影响美观); - 见名知意
修改窗体的标题为 “标准信号槽-演示”;
放置4个按钮显示的文字,以及 name
2.3 连接信号槽
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 连接信号和槽
connect(ui->btnMax, SIGNAL(clicked()), this, SLOT(showMaximized()));
connect(ui->btnNormal, SIGNAL(clicked()), this, SLOT(showNormal()));
connect(ui->btnMin, SIGNAL(clicked()), this, SLOT(showMinimized()));
connect(ui->btnClose, SIGNAL(clicked()), this, SLOT(close()));
}
这样,点击按钮,就实现了预期的功能!
2.4 拓展:快捷键
- 向前复制当前行:
ctrl + alt + up
(向上箭头) - 向后复制当前行:
ctrl + alt + down
(向下箭头)
在使用这两个快捷键时:按住 ctrl + alt +箭头
,可能与系统图形的快捷键冲突, 导致在 Qt Creator 中无法使用
解决办法:
大多数人使用的是因特尔的核心显卡,则用如下方法:
- 右键点击桌面空白处 -> 图形选项 -> 快捷键 ->禁用,就OK了。
- 或者,点击图形属性 -> 找到
ctrl+alt+up
和ctrl+alt+down
,禁用掉就好了,如下:
什么时候会用到屏幕旋转?
如果你是程序员,并且有另外一台外接显示器,把显示器变成竖屏模式可以省去频繁鼠标滚轮滚动,从而提高代码查看的效率
本节对应的视频讲解:B_站_链_接
https://www.bilibili.com/video/BV1vW4y1676Q