信号与槽机制

这篇具有很好参考价值的文章主要介绍了信号与槽机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、信号与槽

1、什么是信号与槽?

信号和槽是用于对象之间的通信,它是Qt的核心机制,在Qt编程中有着广泛的应用。如果想学好Qt,一定要充分掌握信号的槽的概念与使用。

2、信号和槽的代码实例

在Qt中,发送对象、发送的信号、接收对象、槽可以通过很多种方式连接。下面通过一些例子逐一做演示,如下:

2.1、Qt4使用宏

在Qt4及之前的版本基于connect+宏实现信号与槽绑定,其中发送信号和槽函数需要用 SIGNAL() 和 SLOT() 来进行声明,connect函数声明如下:

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, 
    const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

比如点击登录按键完成登录的例子,代码可以这样写:

// 槽函数声明
private slots:
    void login();

通过connect绑定槽函数,如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 登录按键绑定槽函数
    connect(this->ui->btn_ok, SIGNAL(clicked(bool)), this, SLOT(login()));

}

void MainWindow::login()
{
    QString username = ui->lineEdit_username->text();
    QString password = ui->lineEdit_password->text();

    if (username == "jack" && password == "12345") {
        qDebug() << "login success";
    } else {
        qDebug() << "login fail";
    }
}

注意:

  • 声明槽函数要使用private slots或public slots关键字
  • 信号和槽参数不能包含任何变量名,只能包含类型

2.2、使用Qt Creator添加信号的槽函数

通过Qt Creator 界面来完成发送信号和槽函数的连接,比如右键点击一个按钮,然后选择“转到槽”:

信号与槽机制

Qt Creator会自动生成如下代码,首先是槽函数的声明:

// 槽函数声明
private slots:
    void on_btn_cancel_clicked(bool checked);

槽函数实现,如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_btn_cancel_clicked(bool checked)
{
    
}

使用这种方法不需要使用connect函数将信号与槽函数做连接。 这里槽函数的命名有一定的规则,一般是 on_objectname_signal 这样来命名的。这种方法优点是减少了手动敲代码的工作量,缺点是究竟有哪些信号与槽函数做了连接不易被发现,没有connect 函数看起来直观。

2.3、Qt5新connect函数

Qt5推出了新的connect函数,不需要使用SIGNAL()和SLOT()宏,可以在编译时做类型检查,connect函数声明如下:

QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, 
    const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

使用这种方法槽函数的声明不需要放到slots中,只要像普通的函数一样声明就可以了,类型需要与信号保持一致,下面给登录按键绑定槽函数,如下:

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    // 声明槽函数,与普通的成员函数一样
    void login();

private:
    Ui::MainWindow *ui;
};

绑定槽函数

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   
    // 登录按键绑定槽函数
    connect(ui->btn_ok, &QPushButton::clicked, this, &MainWindow::login);
}

void MainWindow::login()
{
    qDebug() << "login";
}

2.4、使用函数指针

在Qt 5版本的connect 函数里,信号与槽函数的参数其实都是函数指针,当信号或槽函数有重载时,使用函数指针可以明确告诉编译器使用哪一个重载函数避免歧义

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

    // 声明两个同名的login函数
    void login();
    void login(int state);

通过函数指针绑定槽函数

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

    // 定义函数指针(注意:声明指向成员函数的指针时,要增加类作用域)
    void (MainWindow::*pfnLoginSlot)() = &MainWindow::login;

    // 登录按键绑定无参槽函数
    connect(ui->btn_ok, &QPushButton::clicked, this, pfnLoginSlot);
}

void MainWindow::login()
{
    qDebug() << "login";
}

void MainWindow::login(int state)
{
    qDebug() << "login state";
}

2.5、使用Lambda表达式

在connect函数中,槽函数参数可以改用Lambda表达式的方式来进行传参。使用 Lambda表达式的好处是代码的书写更加方便快捷,同时不需要在类中对槽函数做任何的声明了

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

    // 使用Lamdbda表达式作为槽函数
    connect(ui->btn_ok, &QPushButton::clicked, this, [=](){
        qDebug() << "login";
    });
}

3、小结

信号与槽提供了一种事件触发机制,发送者与接收者通过connect链接在一起,发送者与接收者之间是松耦合文章来源地址https://www.toymoban.com/news/detail-436509.html

到了这里,关于信号与槽机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt——Qt工作原理:事件驱动、信号与槽机制

    Qt作为一个现代的GUI(图形用户界面)框架,采用了事件驱动的编程范式,并引入了信号与槽机制,以实现高度交互和松耦合的程序设计。下面详细解释了相关概念,以及如何在Qt中使用它们。 事件是在GUI应用程序中的控件上产生的各种动作、操作或状态变化,例如鼠标移动

    2024年02月10日
    浏览(43)
  • 回调函数的使用:案例一:c语言简单信号与槽机制。

    了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制; 回调函数就是一个通过函数指针调用的函数。如果你把 函数的指针 (地址)作为参数 传递 给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 A “callback” is any functi

    2024年02月15日
    浏览(47)
  • Qt子窗口给父窗口传值(信号与槽机制)

    1、父窗口和子窗口名称介绍 父窗口:Test_7 子窗口:testnew 2、父窗口与子窗口内容介绍 子窗口:声明信号、发送信号 父窗口:声明槽函数,定义槽函数,connect连接 3、在父窗口中(Test_7.cpp),完整代码如下: 4、父窗口中(Test_7.h),完整代码如下:  5、子窗口(testnew.cp

    2024年02月11日
    浏览(40)
  • 【python】软件开发——PyQt5、Qt Designer、信号与槽机制、计算器实现

    PyQt5 是一个基于 Python 的 GUI 框架,用于创建跨平台的桌面应用程序。它是 Qt 库的 Python 绑定,结合了 Python 的简洁和易用性以及 Qt 框架的强大功能。 Qt 是一个流行的 C++ 跨平台应用程序开发框架,提供了丰富的图形界面组件、网络通信、数据库访问、多线程等功能。PyQt5 允许

    2024年02月04日
    浏览(44)
  • 【Linux之进程间通信】04.Linux进程间的信号通信

      【Linux之进程间通信】 项目代码获取: https://gitee.com/chenshao777/linux-processes.git (麻烦点个免费的Star哦,您的Star就是我的写作动力!) 04.Linux进程间的信号通信 【目录】   一、进程间信号发送方式   二、进程间信号接收方式   三、进程间信号处理方式 一、进程间信号发

    2024年02月06日
    浏览(43)
  • 详谈Android进程间的大数据通信机制:LocalSocket

    说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。 比如我们在之前文章《WebRtc中是如何处理视频数据的?》提到的我们可以得到WebRtc的视频数据,这时候我们如果有一个需求,希望将这些视频数据传送给另外一个APP呢?这个数

    2024年02月01日
    浏览(69)
  • 【Linux】进程间通信之信号机制

    信号是一个程序中断,且是一个软中断,收到一个信号后,具体怎么处理该信号,什么时候处理是由进程决定的,所以是软中断。 信号的种类:使用 kill -l 命令可以查看有多少个信号 1~31是非可靠信号 34~64是可靠信号 非可靠信号:当前信号有可能丢失,丢失就无法执行该信号

    2024年02月12日
    浏览(38)
  • QT 信号与槽

     .h文件 .cpp文件 现象

    2024年02月02日
    浏览(42)
  • QT基础【5-信号与槽】

    🌈个人主页:godspeed_lucip 🔥 系列专栏:QT从基础到进阶 推荐使用这种写法,信号名字、槽函数名字写错了,编译器会直接报错 参数解释: 第一个参数:信号的发出者 第二个参数:发出的信号 第三个参数:信号的接受者 第四个参数:处理的槽函数 效果: 信号槽机制不只在

    2024年02月21日
    浏览(42)
  • QT的核心——信号与槽

    目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带参的信号 5、信

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包