一文带你入门信号与槽

信号与槽基本介绍


提出疑问,界面上已经有按键了,怎么操作才能让用户按下按键后有操作上的反应呢?
在 Qt 中,信号和槽机制是一种非常强大的事件通信机制。这是一个重要的概念,特别是对于初学者来说,理解它对于编写 Qt 程序至关重要。


概要


1. 信号 (Signals):是由对象在特定事件发生时发出的消息。例如, QPushButton 有一个
clicked() 信号,当用户点击按钮时发出。


2. 槽 (Slots):是用来响应信号的方法。一个槽可以是任何函数,当其关联的信号被发出时,该槽函数将被调用。


3. 连接信号和槽:使用 QObject::connect() 方法将信号连接到槽。当信号发出时,关联的槽函数
会自动执行。

==========================================

四种方法实现信号与槽

四种连接方式

在 Qt 中,有几种不同的方式来设置按键信号与槽的连接,主要包括:
Qt的信号和槽机制是其事件处理系统的核心。这种机制允许对象之间的通信,而不需要它们知道对方的具体实现。

以下是Qt信号和槽的几种常见连接方式的简要概述,我将它们整理成表格形式以便于理解:


这些方式各有优劣,选择哪种方式取决于具体的应用场景、代码风格以及个人偏好。例如,直接使用QObject::connect 是最通用的方式,而使用Lambda表达式可以在同一位置编写信号处理逻辑,提高代码的可读性。使用函数指针的方式则在编译时提供更好的类型检查。自动连接通常在使用Qt Designer设计UI时比较方便

func1 -- 纯ui


第一种添加 信号与槽 的方法  --> 

一.纯界面实现: --> 只提供窗体的简单操作 

1.选中 "编辑信号与槽" (Signals  Slots Edit)

2.点击信号添加新的对

3.下拉选择,信号与槽对应额各个选项


//比如我们这里的意思就是: 当按钮接收到点击信号的时候就能关闭我们的mainWindow这个对象
   --> 点击按钮关闭窗口 


func2: 调用connect API连接

步骤

右击需要的控件 --> 转到槽  --> 选择对应的信号 --> 编写槽函数实现对应功能

fun3/4直接在文件中编写


注意:  在找不到刚刚 创建的 控件的时候,我们可以右击 我们的工程文件 -- > 重新构建 (ctrl + B)


四种方式实现信号与槽的代码

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <iostream>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_2_clicked();
    void on_btnCon_clicked(); // 声明我们定义的槽函数
    void on_btnFourth_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H


mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //func2 -- 在 构造函数中进行 信号与槽的绑定
    //QObject::connect(sender,SIGNAL(signal()),receiver, SLOT(slot()));
     QObject::connect(ui->btnCon1,SIGNAL(clicked()),this,SLOT(on_btnCon_clicked()));
     //func3  -- 使用lambda表达式
     //QObject::connect(sender, &Sender::signal, [=]() {  /* lambda body */ });
     QObject::connect(ui->btnLambda,&QPushButton::clicked,[=](){
         std::cout<<"Lambda按钮"<<std::endl;
     });
     //func4
     //QObject::connect(sender,&Sender::signal, receiver, &Receiver::slot);
     QObject::connect(ui->btnFourth1,&QPushButton::clicked,this,&MainWindow::on_btnFourth_clicked);

}

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

// func1: 通过uidesigner
void MainWindow::on_pushButton_2_clicked()
{
    std::cout<<"点击按钮"<<std::endl;
}
// func2: 通过conn函数实现
void MainWindow::on_btnCon_clicked()
{
    std::cout<<"通过connect实现的槽函数"<<std::endl;
}

void MainWindow::on_btnFourth_clicked()
{
        std::cout<<"第四种方式"<<std::endl;
}


==========================

自定义信号与槽:


在Qt中,自定义信号与槽是实现对象间通信的一种机制。信号和槽是Qt对象通信的核心特性,使得一个对象能够在发生某种事件时通知其他对象。

自定义信号与槽的实现步骤:


1. 定义信号

在Qt中,信号是由 signals 关键字声明的类成员函数。它们不需要实现,只需声明。例如:

class MyClass : public QObject {
Q_OBJECT
public:
MyClass();
signals:
void mySignal(int value);
};

在上面的例子中, MyClass 有一个名为 mySignal 的信号,它带有一个整型参数。


2.定义槽

槽可以是任何普通的成员函数,但通常在类定义中用 slots 关键字标识。槽可以有返回类型,也可以接受参数,但它们的参数类型需要与发出信号的参数类型匹配。

例如:

class MyClass : public QObject {
Q_OBJECT
public slots:
void mySlot(int value);
};

在这个例子中,我们定义了一个名为 mySlot 的槽,它接收一个整型参数。


3.连接信号与槽

使用 QObject::connect 函数将信号与槽连接起来。当信号被发射时,连接到这个信号的槽将被调用

MyClass *myObject = new MyClass();
connect(myObject, SIGNAL(mySignal(int)), myObject, SLOT(mySlot(int)));

这行代码连接了 myObject 的 mySignal 信号到同一个对象的 mySlot 槽。

4.发射信号

使用 emit 关键字发射信号。当信号被发射时,所有连接到这个信号的槽都会被调用
emit mySignal(123);

这将触发所有连接到 mySignal 的槽。
自定义信号和槽是Qt编程中非常强大的特性,它们使得组件之间的通信变得灵活而松耦合。通过信和
槽,可以方便地实现各种复杂的事件驱动逻//辑。

case :



 widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <iostream>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

signals:
   void  mysignal();
   void mysignalparams(int value);

private slots:
   void myslot();
   void myslotparamss(int value);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

==============================================

 widget.cpp


#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,SIGNAL(mysignal()),this,SLOT(myslot()));
    // 带参数的信号 与槽 记得在() 里面加上参数类型
    connect(this,SIGNAL(mysignalparams(int)),this,SLOT(myslotparamss(int)));

    emit(mysignal());  // ;调用我们的信号函数 --> 输出信号
    emit(mysignalparams(20));

}

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

void Widget::myslot()
{
    std::cout<<"myslot"<<std::endl;
}

void Widget::myslotparamss(int value)
{
      qDebug()<<"myslotparams";
      qDebug()<<value;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值