Qt学习笔记(二)Qt 信号与槽

系列文章目录

Qt学习笔记(一)Qt的基础知识及环境编译(泰山派)
Qt学习笔记(二)Qt 信号与槽
Qt学习笔记(三)网络编程
Qt学习笔记(四)多线程


前言

  在学习 Qt 的过程中,信号与槽是必不可少的部分,也是 Qt 编程的
基础,是 Qt 编程的一大创新,这里分一个章节来学习这个 Qt 的信号与槽。


一、Qt 信号与槽机制

1.1 什么是信号和槽

  信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的CurrentIndexChanged() 信号。GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
  槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
在这里插入图片描述

1.1 信号和槽的关联及断连

  信号与槽关联是用 QObject::connect() 函数实现的,它是connect() 是 QObject 类的一个静态函数,其基本格式是:

// 完整格式
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

// 在实际调用时可以忽略前面的限定符
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

  其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。
  断开连接需要使用 disconnect()函数,其格式如下:

// 断开一切与 myObject 连接的信号或槽
bool QObject::disconnect(sender,SIGNAL(signal()), receiver, SLOT(slot()));

  信号与槽机制是 Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。我们在平常编辑的时候可以直接利用UI设计器进行编辑(自动关联),当运行之后会自动生成Ui_MainWindow.h文件。
在这里插入图片描述
在这里插入图片描述

二、编辑槽函数

1. 自动关联

  右键我们的控件,选择转到槽,然后选择一个触发方式,之后便会在mainwindow.cpp文件下生成一个槽函数,并在mainwindow.h下进行申明。这里要特别注意,槽函数只能申明在private slots 或者public slots下
在这里插入图片描述
  在生成的on_connect_clicked( )槽函数中进行功能编辑,笔者这里是进行了一个打印功能。
在这里插入图片描述
  执行之后可以看到,下方的控制窗口已经打印出来了信息。
在这里插入图片描述

2. 手动关联

  这种方式需要用的我们上文提到的connect和disconnect函数,主要是服务于大型项目。它可以自定义更多槽函数功能和名称,具有极大的灵活性,同时由于所有界面都在代码中定义,避免了 UI 文件和逻辑代码分离带来的管理复杂性,所有人都能在代码中找到界面和逻辑。以下是手动关联的基本流程:

  1. 创建项目与 UI 设计
      假设你已经在 Qt Designer 中设计了一个简单的窗口(也可以纯代码编写),包含一个按钮 pushButton 和一个标签 label。
  2. 创建 C++ 类
      创建一个 C++ 类并添加信号的声明,通常是继承自 QMainWindow 或 QWidget。
// 头文件 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void myCustomSignal();  // 声明自定义信号
    
private slots:  // 声明槽函数
    void onButtonClicked();
    
private:
    Ui::MainWindow *ui;  // UI 指针
};
#endif // MAINWINDOW_H
  1. 实现构造函数与析构函数
// 源文件 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);  // 设置 UI

    // 手动连接信号与槽
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); // 连接按钮的点击信号到槽
}

MainWindow::~MainWindow()
{
    delete ui;
}

  1. 实现槽函数
      在 mainwindow.cpp 中,实现槽函数,这部分同上文自动关联。

免责声明:本文参考了网上公开的部分资料,仅供学习参考使用,若有侵权或勘误请联系笔者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值