Блокировка и удаление обработчика

Для блокировки и удаления обработчиков предназначены следующие методы из класса QObject:

  • blockSignals() — временно блокирует прием сигналов, если параметр имеет значение true, и снимает блокировку, если параметр имеет значение false. Метод возвращает логическое представление предыдущего состояния соединения. Прототип метода:
bool blockSignals(bool block)
  • signalsBlocked() — метод возвращает значение true, если блокировка установлена, и false — в противном случае. Прототип метода:
bool signalsBlocked() const
  • disconnect() — удаляет обработчик. Метод является статическим и доступен без создания экземпляра класса. Прототипы метода:
static bool disconnect(const QObject *sender, const char *signal,
   const QObject *receiver, const char *method)
static bool disconnect(const QObject *sender,
   const QMetaMethod &signal, const QObject *receiver,
   const QMetaMethod &method)
static bool disconnect(const QMetaObject::Connection &connection)
static bool disconnect(const QObject *sender,
   PointerToMemberFunction signal, const QObject *receiver,
   PointerToMemberFunction method)

Существует также не статический метод disconnect(). Прототипы метода:

bool disconnect(const char *signal = nullptr,
   const QObject *receiver = nullptr,
   const char *method = nullptr) const
bool disconnect(const QObject *receiver,
   const char *method = nullptr) const

Если обработчик успешно удален, то метод disconnect() возвращает значение true. Значения, указанные в методе disconnect(), должны совпадать со значениями, используемыми при назначении обработчика. Например, если обработчик назначался таким образом:

connect(btn1, SIGNAL(clicked()),
        this, SLOT(on_btn1_clicked()));

то удалить его можно следующим образом:

disconnect(btn1, SIGNAL(clicked()),
           this, SLOT(on_btn1_clicked()));

Создадим окно с четырьмя кнопками. Для кнопки Нажми меня назначим обработчик для сигнала clicked(). Чтобы информировать о нажатии кнопки выведем сообщение в окно консоли. Для кнопок Блокировать, Разблокировать и Удалить обработчик создадим обработчики, которые будут изменять статус обработчика для кнопки Нажми меня. Содержимое файла widget.h приведено в листинге 4.6, файла widget.cpp — в листинге 4.7, а файла main.cpp — в листинге 4.8.

Листинг 4.6. Содержимое файла widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();
private slots:
   void on_btn1_clicked();
   void on_btn2_clicked();
   void on_btn3_clicked();
   void on_btn4_clicked();
private:
   QPushButton *btn1;
   QPushButton *btn2;
   QPushButton *btn3;
   QPushButton *btn4;
   QVBoxLayout *vbox;
};
#endif // WIDGET_H

Листинг 4.7. Содержимое файла widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
   btn1 = new QPushButton("Нажми меня");
   btn2 = new QPushButton("Блокировать");
   btn3 = new QPushButton("Разблокировать");
   btn4 = new QPushButton("Удалить обработчик");
   btn3->setEnabled(false);
   vbox = new QVBoxLayout();
   vbox->addWidget(btn1);
   vbox->addWidget(btn2);
   vbox->addWidget(btn3);
   vbox->addWidget(btn4);
   setLayout(vbox);
   connect(btn1, SIGNAL(clicked()),
           this, SLOT(on_btn1_clicked()));
   connect(btn2, SIGNAL(clicked()),
           this, SLOT(on_btn2_clicked()));
   connect(btn3, SIGNAL(clicked()),
           this, SLOT(on_btn3_clicked()));
   connect(btn4, SIGNAL(clicked()),
           this, SLOT(on_btn4_clicked()));
}

void Widget::on_btn1_clicked()
{
   qDebug() << "Нажата кнопка 1";
}

void Widget::on_btn2_clicked()
{
   btn1->blockSignals(true);
   btn2->setEnabled(false);
   btn3->setEnabled(true);
}

void Widget::on_btn3_clicked()
{
   btn1->blockSignals(false);
   btn2->setEnabled(true);
   btn3->setEnabled(false);
}

void Widget::on_btn4_clicked()
{
   disconnect(btn1, SIGNAL(clicked()),
              this, SLOT(on_btn1_clicked()));
   btn2->setEnabled(false);
   btn3->setEnabled(false);
   btn4->setEnabled(false);
}
Widget::~Widget() {}

Листинг 4.8. Содержимое файла main.cpp

#include "widget.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Widget window;
   window.setWindowTitle("Блокировка и удаление обработчика");
   window.resize(350, 150);
   window.show();
   return app.exec();
}

Если после отображения окна нажать кнопку Нажми меня, то в окно консоли будет выведена строка Нажата кнопка 1. Нажатие кнопки Блокировать производит блокировку обработчика. Теперь при нажатии кнопки Нажми меня никаких сообщений в окно консоли не выводится. Отменить блокировку можно с помощью кнопки Разблокировать. Нажатие кнопки Удалить обработчик производит полное удаление обработчика. В этом случае чтобы обрабатывать нажатие кнопки Нажми меня необходимо заново назначить обработчик.

Отключить генерацию сигнала можно также сделав компонент недоступным с помощью следующих методов из класса QWidget:

  • setEnabled() — если в параметре указано значение false, то компонент станет недоступным. Чтобы сделать компонент опять доступным следует передать значение true. Метод является слотом. Прототип метода:
void setEnabled(bool)
  • setDisabled() — если в параметре указано значение true, то компонент станет недоступным. Чтобы сделать компонент опять доступным следует передать значение false. Метод является слотом. Прототип метода:
void setDisabled(bool disable)

Проверить, доступен компонент или нет, позволяет метод isEnabled(). Метод возвращает значение true, если компонент доступен, и false — в противном случае. Прототип метода:

bool isEnabled() const

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов