Qt之QObject::blockSignals函数的使用和理解

在某些业务下,需要阻塞住对象某个信号的发送,避免它触发对应的槽影响到后续的操作。可以通过bool QObject::blockSignals(bool block)来做简单的处理。

从qt的帮助文档可以了解到,如果blockSignals(bool block)的参数block设置为true,那么信号的发送会被阻塞,反之不会阻塞。而且被阻塞时,发出的信号不会被缓存。即使对象的信号被阻塞住,也对destroyed()信号没有影响。

可以通过signalsBlocked()函数来判断某个对象的信号是否被阻塞。

下面是一个简单的demo:

当设置了阻塞后,updateText按钮将无法改变label的值。只有取消阻塞以后才可以使得槽生效。

/.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

public slots:
    void onPushButtonClicked();
    void onSetBlockedSignalStatus();

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


/cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMetaMethod>

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

    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(onPushButtonClicked()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(onSetBlockedSignalStatus()));
    ui->pushButton->blockSignals(true);
}

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

void Widget::onPushButtonClicked()
{
    ui->label->setText("Hello Qt");
}

void Widget::onSetBlockedSignalStatus()
{
    if(ui->pushButton->signalsBlocked())
    {
        ui->label_2->setText("blockSignals(false)");
        ui->pushButton->blockSignals(false);    //不阻塞信号
        return;
    }
    ui->label->setText("TextLabel");
    ui->label_2->setText("blockSignals(true)");
    ui->pushButton->blockSignals(true); //阻塞信号
}


除了使用bool QObject::blockSignals(bool block)函数,还可以使用disconnect函数暂时断开信号和对应槽的连接,等处理完业务再connect上,当然频繁的disconnect和connect并不友好,更推荐使用blockSignals。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QObject::connect函数可以用来建立对象之间的信号和槽的连接,可以使一个对象的信号触发另一个对象的槽函数。它的用法是:QObject::connect(sender, signal, receiver, slot)。 ### 回答2: QObject::connect函数Qt中用于建立信号与槽连接的函数,它的语法如下: QObject::connect(sender, signal, receiver, slot, connectionType); 其中,sender是发送信号的对象,signal是发出的信号,receiver是接收信号的对象,slot是处理信号的槽函数。connectionType是一个可选参数,用于指定连接的类型,默认为Qt::AutoConnection。 使用QObject::connect函数,首先需要确定信号和槽函数的声明,然后可以在程序的任意位置调用该函数进行连接。例如,假设有一个按钮对象button和一个槽函数slotFunction,可以使用以下代码连接信号与槽: QObject::connect(button, SIGNAL(clicked()), this, SLOT(slotFunction())); 在这个例子中,当按钮被点击时,会触发一个clicked信号,然后会调用槽函数slotFunction来处理该信号。 连接时还可以使用lambda表达式来代替槽函数,例如: QObject::connect(button, &QPushButton::clicked, [](){ qDebug() << "Button clicked"; }); 这里使用了C++11的lambda表达式作为槽函数,当按钮被点击时,会输出一条调试信息。 需要注意的是,QObject::connect函数只能连接QObject或其子类的实例之间的信号与槽,且槽函数必须是可调用的(可以是普通函数、成员函数、静态函数等)。 总结而言,QObject::connect函数Qt中用于建立信号与槽连接的重要函数,它的使用需要理解信号与槽的声明,并进行正确的参数传递。 ### 回答3: QObject::connect函数用于建立信号和槽之间的连接,使得当信号触发时,槽函数会被自动调用。 函数的基本语法如下: connect(sender, signal, receiver, slot, Qt::ConnectionType); 其中,sender是发送信号的对象,signal是发送的信号,receiver是接收信号的对象,slot是接收信号调用的槽函数。 例子: 我们有一个名为button的QPushButton对象,我们想在用户点击按钮时触发一个名为myFunction的槽函数。 首先,我们需要在Qt头文件中声明和定义槽函数myFunction。 然后,在我们的代码中,我们可以连接按钮的clicked信号和myFunction槽函数,如下所示: QObject::connect(button, &QPushButton::clicked, this, &MyClass::myFunction); 在这个例子中,button是发送clicked信号的对象,&QPushButton::clicked表示clicked信号,this是接收信号的对象,&MyClass::myFunction表示myFunction槽函数。 最后一个参数Qt::ConnectionType是可选的,默认为Qt::AutoConnection,会根据发送和接收对象的线程自动选择信号的连接方式。你可以根据需要使用其他连接方式。 总结起来,QObject::connect函数简单地描述了信号和槽之间的连接关系,使得当信号发出时,槽函数会被自动调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值