Qt断开信号与槽的方法,Qt信号的处理 (connect和disconnect和blockSignals的使用方法)

2023-05-16

关于信号与槽的研究

DisConnect:

bool QObject::disconnect(const QObject * sender, const char * signal, const QObject * receiver, const char *method) [static]

1. Disconnect everything connected to an object's signals:

取消某个对像的所有的信号连接:

disconnect(myObject,0,0,0);

equivalent to the non-static overloaded function

等价于:

myObject->disconnect();

2. Disconnect everything connected to a specific signal:

取消某个信号与它对应槽的所有连接:

disconnect(myObject, SIGNAL(mySignal()),0,0);

equivalent to the non-static overloaded function

等价于:

myObject->disconnect(SIGNAL(mySignal()));

3. Disconnect a specific receiver:

断开某个接收对象的连接:

disconnect(myObject,0, myReceiver,0);

equivalent to the non-static overloaded function

等价于:

myObject->disconnect(myReceiver);

/************************************

Qt信号的处理 (connect和disconnect和blockSignals的使用方法)

信号槽机制是Qt的非常重要的机制,本文不剖析信号槽机制的原理,只讲信号的主要使用方法。

信号:当某个事件发生后,比如按钮检测到自己被点击了一下,按钮会发出一个信号,这种发出是没有目的的,类似广播。

1. 信号连接槽  connect函数
connect函数最常用的一般形式:

connect(sender, signal, receiver, slot);
2. 解除信号和连接到信号的槽的连接 disconnect函数
disconect函数的原型如下:

bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
一般有四种用法:

2.1  解除myObject对象的所有信号连接,调用后myObject对象发出的所有信号都得不到响应。

    disconnect(myObject, 0, 0, 0);
//等同于
    myObject->disconnect();
2.2  解除myObject对象的mySignal信号的所有连接,调用后myObject对象发出的mySignal信号得不到响应。

    disconnect(myObject, SIGNAL(mySignal()), 0, 0);
//等同于
    myObject->disconnect(SIGNAL(mySignal()));
2.3  解除myObject对象与myReceiver对象的信号连接,调用后myObject对象发出的所有信号得不到myReceiver对象的响应。

    disconnect(myObject, 0, myReceiver, 0);
//等同于
    myObject->disconnect(myReceiver);
2.4  解除myObject对象的mySignal信号与myReceiver对象的mySlot槽的连接,调用后myObject对象发出的mySignal信号得不到myReceiver对象的mySlot槽的响应。

    disconnect(myObject, SIGNAL(mySignal()), myReceiver, SLOT(mySlot()));
//等同于
    myObject->disconnect(SIGNAL(mySignal(), myReceiver, SLOT(mySlot())));
ps:上述4种用法中,0是通配符,它表示任一信号、任一接收对象、任一槽。

3. 阻塞信号  blockSignals函数
blockSignals的函数原型如下:

bool QObject::blockSignals(bool block)
用法:

//object发出的信号被阻塞,系统不会调用任何连接到object的处理。
object->blockSignals(true);
 
//解除信号阻塞
object->blockSignals(false);
4.案例
//widget.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = 0);
    ~Widget(){}
};
 
#endif // WIDGET_H
//widget.cpp

#include "widget.h"
 
#include <QPushButton>
#include <QGridLayout>
#include <QDebug>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    /* 创建控件 */
    QPushButton *btnClick      = new QPushButton("click me", this);
    QPushButton *btnBlock      = new QPushButton("block", this);
    QPushButton *btnUnblock    = new QPushButton("unblock", this);
    QPushButton *btnDisconnect = new QPushButton("disconnect", this);
 
    QGridLayout *pLayout = new QGridLayout();
    pLayout->addWidget(btnClick, 0, 0);
    pLayout->addWidget(btnBlock, 0, 1);
    pLayout->addWidget(btnUnblock, 0, 2);
    pLayout->addWidget(btnDisconnect, 0, 3);
    this->setLayout(pLayout);
 
    /* 信号槽 */
    connect(btnClick, &QPushButton::clicked, this, [=]()
    {
        qDebug() << "点击按钮";
    });
 
    connect(btnBlock, &QPushButton::clicked, this, [=]()
    {
        btnClick->blockSignals(true);
        btnBlock->setEnabled(false);
        btnUnblock->setEnabled(true);
    });
 
    connect(btnUnblock, &QPushButton::clicked, this, [=]()
    {
        btnClick->blockSignals(false);
        btnBlock->setEnabled(true);
        btnUnblock->setEnabled(false);
    });
 
    connect(btnDisconnect, &QPushButton::clicked, this, [=]()
    {
        disconnect(btnClick, &QPushButton::clicked, this, 0);
    });
 
}
//main.c

#include "widget.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
 
    return a.exec();
}
结果:

1.按下"click me"按钮,窗口接收到"click me"按钮发出的clicked信号,打印"点击按钮"。

2.然后再按下"block",再次按下"click me"按钮,没有打印"点击按钮"。这是因为 "click me"按钮发出的信号被阻塞了,没有得到响应。

3.然后再按下"unblock"按钮,再次按下"click me"按钮,打印"点击按钮"。这是因为解除了"click me"按钮的信号阻塞。

4.最后按下"disconnect"按钮,此时按下"click me"按钮没有反应。这是因为解除了本窗口与"click me"按钮的clicked信号的连接。 
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt断开信号与槽的方法,Qt信号的处理 (connect和disconnect和blockSignals的使用方法) 的相关文章

随机推荐

  • C++ 怎么取整形数组的长度

    本文主要讨论两个小点 xff0c 怎样获取主函数中整形数组的长度 xff1b 自定义函数输入参数为整型数组 xff0c 怎么得到该数组长度 正文 很早就知道C 43 43 中 xff0c 因为栈的回收机制 xff0c 函数的返回值不可以是数
  • QT中窗口关闭自动销毁

    我们知道c 43 43 内存管理的一个规则 xff1a new出来的对象 xff0c 一定要delete 我们实现一个弹窗的时候 xff0c 有时候继承widget xff0c 有时候继承dialog 不管哪种 xff0c 窗体调用show
  • 8uftp怎么下载客户文件,8uftp怎么实现下载客户文件

    8uftp是ftp软件当中的一款 xff0c 涵盖其它FTP工具所有的功能 小编在进行ftp工具使用时 xff0c 除了8uftp外还发现了另外一款更好用的ftp工具 xff0c 那就是iis7服务器管理工具 IIS7服务器管理工具中的ft
  • Qt中带返回值的信号发射(使用QMetaObject::invokeMethod)

    一般来说 xff0c 我们发出信号使用emit这个关键字来操作 xff0c 但是会发现 xff0c emit并不算一个调用 xff0c 所以它没有返回值 那么如果我们发出这个信号想获取一个返回值怎么办呢 xff1f 两个办法 xff1a 1
  • C++:delete和delete[]释放内存的区别

    C 43 43 中free 与delete的区别 1 new delete是C 43 43 的操作符 xff0c 而malloc free是C中的函数 2 new做两件事 xff0c 一是分配内存 xff0c 二是调用类的构造函数 xff1
  • C++基本知识点

    1 字符串的末尾 39 39 也算一个字符 xff0c 一个字节 2 使用库函数strcpy a b 进行拷贝b gt a操作 xff0c strcpy会从源地址一直往后拷贝 xff0c 直到遇到 39 39 为止 所以拷贝的长度是不定的
  • C++析构函数

    格式 xff1a 类名 void 没有参数 xff0c 没有返回值 xff0c 不能被重载 xff0c 一个类只能有一个析构函数 对象销毁时自动执行 主要负责清理对象生命周期中的动态资源 include lt iostream gt usi
  • QT中Json的使用方法(类和json字符串相互转换的方法)

    在QT5 0版本以后支持对Json的使用 xff0c 直接使用QT提供的json类进行数据的组织和解析 Json类介绍QJsonDoucument它封装了一个完整的 JSON 文档 xff0c 并且可以从 UTF 8 编码的基于文本的表示以
  • Qt中QJsonObject类

    00 目录 01 QJsonObject类简介 02 公有类型 03 公有成员方法 04 公有成员方法解析 05 参考示例 06 附录 01 QJsonObject类简介 Header include lt QJsonObject gt q
  • QT中操作Txt文件(Qt中QString与QByteArray互相转化方法)

    Qt如何把QString写入txt文件中 1 示范代码 由于write不能把QString直接写入文件中 xff0c 因此有两种方法来处理 xff1a 1 使用QTextStream类 中英文都可以存 读入文件 QFile file fil
  • QCoreApplication类各函数功能说明(获取应用程序路径、获取上一级目录)

    QT获取当前目录的上一级目录dir xff1e cdUp QDir dir 61 new QDir QDir currentPath D Project Core dir gt cdUp dir gt path D Project 1 构造
  • qt中解决QString中文乱码问题方法

    Qt中解决中文乱码的问题 qt中一般在设计师界面中设置的中文标题啥的都能正常显示 但是在QString中 xff0c 比如QPainter在绘制Text的时候 xff0c 传入的 char 如果含有中文 xff0c 则一般都会显示乱码 这个
  • QString转换QByteArray时中文问题解决方案

    平常转换没怎么注意 xff0c 一般QString转换成QByteArray不会出现问题 xff0c 今天涉及到QJsonDocument类 xff0c 转换出现以下问题 xff1a 1 用toLocal8Bit QJsonDocument
  • 2020-08-27python二(转载)

    usr bin python3 python二 print 39 Python二 39 39 39 39 11 多个变量赋值 Python允许你同时为多个变量赋值 例如 xff1a 同时为多个变量赋值 xff0c 这些变量的值为1 a 61
  • QT中QLIST清空问题分析

    1 代码分析 向QList中添加4个项 QList lt QWidget gt lstWidget lstWidget append new QWidget lstWidget append new QWidget lstWidget ap
  • DAQ数据采集卡软件编程-只支持一个程序来访问设备

    1 安装软件开发包 xff08 SDK xff09 DAQNAVI SDK 2 可识别到数据采集卡片 3 加载C 编程的动态链接库 dll文件 xff08 Automation BDaq dll与Automation BDaq4 dll区别
  • 实现与研华 PCI 采集卡通讯

    如果使用过 PCI 采集卡的盆友应该对 研华 这个品牌不陌生 xff0c 可以说研华还是很强大的 最近因为工作需要 xff0c 使用一块研华的 PCI1714UL 型号的采集卡 xff0c 去高速采集电压信号 xff0c 学习了几天后分享给
  • QT中connect函数的几种用法详解总结

    前言 信号与槽机制是QT非常核心的东西 xff0c 通过信号与槽我们可以将不同的部分有机的结合起来 xff0c 使得各个组件之间的交互简单高效 xff0c 信号与曹槽像是设计模式中的观察者模式 xff08 我自己觉得是这样 xff09 xf
  • Qt中QThread安全退出方式总结

    QThread的使用方式 在Qt中 xff0c 使用QThread实现子线程的方式有两种 xff1a 继承QThread xff0c 重写run函数 继承QObject xff0c 使用moveToThread方式移动进QThread QT
  • Qt断开信号与槽的方法,Qt信号的处理 (connect和disconnect和blockSignals的使用方法)

    关于信号与槽的研究 DisConnect bool QObject disconnect const QObject sender const char signal const QObject receiver const char me