博客
关于我
信号和槽
阅读量:531 次
发布时间:2019-03-09

本文共 2092 字,大约阅读时间需要 6 分钟。

关联

在UI界面中,右击控件并选择“转到槽”以手动关联信号和槽。

自动关联

  • 在UI界面中右击控件并选择“转到槽”。

手动关联

  • 自定义信号:可以有参数,可以重载,需声明(不用实现),返回void,写到signals下。

    • 例如:
      class sj : public QObject {Q_OBJECTpublic:explicit sj(QObject *parent = nullptr);signals:void issj();void issj(QString i); // 带参数的信号};
  • 自定义槽:可以有参数,可以重载,需声明并实现,返回void,写到public slot下或public或全局函数下。

    • 例如:
      class me : public QObject {Q_OBJECTpublic:explicit me(QObject *parent = nullptr);public slots:void happy();void happy(QString j); // 带参数的槽};

信号与槽连接方式

方法一:使用connect函数

  • 方式一

    connect(signal_sender, SIGNAL(signal_name),       receiver_object, SLOT(slot_function_name));
    • 示例:
      connect(qPushButton, QPushButton::clicked, this, QWidget::close);
  • 方式二

    • 情况一:无重载时。
      connect(qPushButton, QPushButton::clicked, this, WPARAM::close);
    • 情况二:自定义信号和槽,且有重载。
      connect(sj_obj, sj::issj, me_obj, me::happy);

方法二:使用函数指针

  • 情况二:通过函数指针连接自定义信号和槽。
    • 信号和槽可重载。

    • 例如:

      class sj {public:void issj() {};void issj(QString i) {};};
      class me {public:void happy() {};void happy(QString j) {};};
      connect(sj_obj, sj::issj, me_obj, me::happy);
  • 情况三:使用connect结合lambda函数:
    connect(sj_obj, sj::issj, me_obj, [=]() { me_obj->happy(); });

信号其他说明

关系连接

  • 单个信号可连接多个槽。
    • 示例:
      connect(button, QPushButton::pressed, slot1, slot_function);connect(button, QPushButton::pressed, slot2, slot_function);
  • 多个信号可连接同一槽:
    connect(button1, QPushButton::pressed, receiver, receiver_function);connect(button2, QPushButton::pressed, receiver, receiver_function);

断开连接

  • 使用disconnect函数断开特定连接。
    • 示例:
      disconnect(button, QPushButton::pressed, slot1, slot_function);

连接类型

  • Qt::DirectConnection:异步,信号处理在下一轮事件迭代中。
  • Qt::QueuedConnection:异步,信号处理在主线程队列中。
  • Qt::BlockingQueuedConnection:同步,堵塞当前线程。
  • Qt::AutoConnection:默认,根据连接的频率选择线程类型。
  • Qt::UniqueConnection:确保只建立一个连接,不会被多次连接。

带参数和槽的连接

  • 信号参数与槽参数一一对应。

    • 示例:
      connect(sender, signal_name, receiver, slot_function, Qt::AutoConnection);
  • 示例代码中路径处理:

    #include 
    #include "me.h"using namespace std;me::me(QObject *parent) : QObject(parent) {}void me::happy() { qDebug() << "开心";}void me::happy(QString j) { qDebug() << "开心" << j;}
    • 简单连接例子:
      connect(s, sj::issj, m, me::happy);emit s->issj();

通过以上方法,可以根据不同需求灵活配置信号和槽的连接方式,充分发挥Qt的多功能性。

转载地址:http://zeeiz.baihongyu.com/

你可能感兴趣的文章
【ES6(2015)】RegExp
查看>>
浅谈持续集成(CI)、持续交付(CD)、持续部署(CD)
查看>>
HDU4814——数学,模拟进制转换
查看>>
一些JavaSE学习过程中的思路整理(二)(主观性强,持续更新中...)
查看>>
JavaScript中如何给按钮设置隐藏与显示属性
查看>>
Python——5函数
查看>>
C++扬帆远航——1
查看>>
上周热点回顾(5.3-5.9)
查看>>
测试网络联接状况常用命令 ping 使用方法介绍
查看>>
【Bootstrap5】精细学习记录
查看>>
面试官:这些错误都没见过,还敢说会安装Elasticsearch?
查看>>
Java复习面试指南-06为什么要进行数据类型转换?什么情况下会进行自动类型转换?
查看>>
[源码解析] 并行分布式任务队列 Celery 之 EventDispatcher & Event 组件
查看>>
QQ框架的搭建
查看>>
Hololens2开发笔记-捕获照片到内存并上传至服务器(unity)
查看>>
OpenCV4(6)-LookUpTable(LUT)查找表(C++,Python,JS)
查看>>
SkyWalking性能剖析
查看>>
vue动态组件与插件到底是什么?
查看>>
【2021.5.8 NOI模拟】贪心
查看>>
python3下安装jupyter kernel报错问题
查看>>