【QT开发笔记-基础篇】| 第一章 QT入门 | 1.5 标准信号槽

发布于:2023-02-01 ⋅ 阅读:(850) ⋅ 点赞:(0)

本节对应的视频讲解:B_站_链_接

https://www.bilibili.com/video/BV1vW4y1676Q

本节讲解信号和槽的概念,以及标准的信号槽

标准信号槽-案例


1. 什么是信号槽


1.1 信号

首先看一下什么是事件和信号

QPushButton 的单击事件为例:

按下按钮,会触发 mousePressEvent 事件,然后 QPushButton 会发射 pressed() 信号;

松开按钮,会触发 mouseReleaseEvent 事件,然后 QPushButton 会发射 released() 信号和 clicked() 信号

常用的事件有很多,比如鼠标的单击和双击事件,鼠标的移动事件,键盘的输入事件等。事件会专门在后边进行讲解

当某个实例化的对象上产生这些事件时,该实例化对象就会发出特定的信号。

信号的本质就是函数,并且是只需声明,无需实现的函数

具体一个类有哪些信号,可以查看 Qt 的帮助文档,以 QPushButton 为例:

首先打开 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 类的静态方法,它有多个重载的方法,如下:
connect

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+upctrl+alt+down,禁用掉就好了,如下:
    快捷键冲突

什么时候会用到屏幕旋转
如果你是程序员,并且有另外一台外接显示器,把显示器变成竖屏模式可以省去频繁鼠标滚轮滚动,从而提高代码查看的效率


本节对应的视频讲解:B_站_链_接
https://www.bilibili.com/video/BV1vW4y1676Q



网站公告

今日签到

点亮在社区的每一天
去签到