QT基础【5-信号与槽】

简介: QT基础【5-信号与槽】



1 Qt槽函数的写法

1.1 Qt4的写法(不推荐)

connect(ui->element_name, SlGNAL(clicked), this, slot(function()));

1.2 Qt5的写法

connect(ui.element_name,&QPushButton::clicked, this,&Widget::func_name);

推荐使用这种写法,信号名字、槽函数名字写错了,编译器会直接报错

参数解释:

第一个参数:信号的发出者

第二个参数:发出的信号

第三个参数:信号的接受者

第四个参数:处理的槽函数

1.3 示例

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(btn_click())); //QT4的写法;
    connect(this->ui->pushButton,&QPushButton::clicked,this,&Widget::btn_click); //Qt5的写法;
    //解释:将按钮点击事件绑定到名为pushButton的ui控件上,当该控件发生点击事件时,会运行btn_click函数。
}
Widget::~Widget()
{
    delete ui;
}
void Widget::btn_click(){
    QMessageBox::information(this,"title","push");
}

效果:

2 C++模板技术实现Qt信号槽机制

2.1 概述

信号槽机制不只在Qt中才可以实现,一般的C++项目也可以使用信号槽

信号的好处:例如类B要使用类A,则B就必须包含A,假如项目较大,文件较多,就很容易出错。而使用信号之后,就可以完成解耦。

与Qt中的信号一样,sigslot的槽函数返回值为void(因为槽函数只是用来响应信号的,通常不关心它的返回值是什么)

另外,槽函数和信号的参数列表也必须是一致的

2.2 代码

首先新建一个C++空项目,并添加sigslot.h头文件和sigslot.cc源文件。文件我都会放在百度网盘中,以供下载。

window中定义了2个信号,handle_signal中定义了两个槽函数,main函数中绑定信号和槽函数,并发送信号。

#include "sigslot.h"
#include<iostream>
using namespace std;
class window { //发送信号的类
public:
  //定义一些信号
  sigslot::signal0<>sig_button_click;
  sigslot::signal1<int>sig_print;
  //在sibgslot中,signal0表示不带任何参数的信号,signal1表示带一个参数的信号
};
class handle_signal :public sigslot::has_slots<> { //处理信号的类
public:
  void handle_button_click_sig() {
    cout << "按钮点击信号被调用" << endl;
  }
  void handle_print_sig(int val1) {
    cout << "打印信号被发送,值为:" << val1 << endl;
  }
};
int main() {
  window w;
  handle_signal handle;
  w.sig_button_click.connect(&handle, &handle_signal::handle_button_click_sig);
  w.sig_print.connect(&handle, &handle_signal::handle_print_sig);
  w.sig_button_click.emit(); //发送信号
  w.sig_print.emit(100); //发送信号
  return 0;
}

2.3 下载链接

百度网盘链接:提取码:ikun

参考:c++之sigslot库 - mohist - 博客园 (cnblogs.com)

3 总结

在代码的舞台上翩翩起舞, Qt,如诗如画,编织梦的彩虹。

跨越平台的轻盈舞姿, 文档的琴音,灵感的涟漪。

模块的花瓣,细腻而丰满, 开发者的心灵,在那里盛开。

清新而深邃,如林中明月, Qt,用优雅的笔触,谱写未来的篇章。

渴望挑战Qt的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多Qt的奇迹吧。我们推出了引领趋势的💻QT专栏:《QT从基础到进阶》 ,旨在深度探索Qt的实际应用和创新。🌐🔍

相关文章
|
2月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
504 4
|
2月前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
49 0
|
2月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
2月前
|
开发者
QT基础【6-跨界面发送信号】
QT基础【6-跨界面发送信号】
|
2月前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
30 0
QT自定义信号,信号emit,信号参数注册
|
2月前
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
172 0
|
2月前
|
安全 编译器 开发者
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
74 0
|
1月前
|
安全 C++ Windows
Qt信号与槽机制
Qt信号与槽机制
20 1
|
11天前
|
C++
Qt信号和槽
Qt信号和槽
14 2