Qt/C++ Tutorial 078. Do not mix the old syntax of signals and slots on SIGNAL SLOT macros with new syntax on pointers

signal, Slot, Qt

We all know that in Qt there are two syntaxes of signals and slots:

But also, as it is not necessary to interfere with beer with vodka, with the same success it is not necessary to mix two syntaxes within the framework of one project.

Of course, there are projects that write a lot of code and make a complete refactoring on changing the whole syntax is quite an overhead job, but if you, gradually completing the project, switch to a new syntax, try to update all the code places with the given one connection to a new syntax.

The fact is that for both cases ( SINGAL SLOT macros and syntax on pointers ) other contents of moc files are formed, which leads to the fact that mixed usage of connect and disconnect methods does not work as expected. And to be precise, the disconnect method will not work if connect was called using macros, and disconnect was called using pointers.

Example

We will create a trial project in which there will be a window and one button. Add a slot in the window. And in the window class designer, let's check the four combinations of connecting the button signal to the window slot:

  1. connect SIGNAL SLOT - disconnect SIGNAL SLOT
  2. connect SIGNAL SLOT - disconnect on pointers
  3. connect on pointers - disconnect on pointers
  4. connect on pointers - disconnect SIGNAL SLOT

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void checkSlot() {} // Slot for checking

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QDebug>

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

    qDebug() << "First test";
    qDebug() << connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(checkSlot()));
    qDebug() << disconnect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(checkSlot()));

    qDebug() << "Second test";
    qDebug() << connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(checkSlot()));
    qDebug() << disconnect(ui->pushButton, &QPushButton::clicked, this, &Widget::checkSlot);

    qDebug() << "Third test";
    qDebug() << connect(ui->pushButton,&QPushButton::clicked, this, &Widget::checkSlot);
    qDebug() << disconnect(ui->pushButton, &QPushButton::clicked, this, &Widget::checkSlot);

    qDebug() << "Fourth test";
    qDebug() << connect(ui->pushButton,&QPushButton::clicked, this, &Widget::checkSlot);
    qDebug() << disconnect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(checkSlot()));
}

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

Output

First test
true
true
Second test
true
false
Third test
true
true
Fourth test
true
true

Thus, it turns out that the pair connect SINGAL SLOT - disconnect on the pointers gives the wrong result that was expected. And in fact the slot remains connected.

Therefore, beginners recommend that I pay close attention to this nuance of working with signals and slots in Qt.

10% refund of hotel reservation amount on Booking
10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking
Support the author Donate
c

Who hasn’t mixed beer with vodka! 🤢🤮

vodka + beer = strong coctail, but it is bad ))

  • #
  • June 4, 2018, 12:41 p.m.

disconnect - обязательно делать, во всех случаях?

Если удаляете объект, то все коннекты отключаются автоматически, здесь следить не требуется.

В остальных случаях disconnect нужно делать тогда, когда Вам нужно отключить сигнал-слотовое соединение в соответствии с логикой вашей программы, то есть на ваше усмотрение.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

A
Aug. 22, 2019, 11:24 p.m.
Aleksandr73

Qt - Test 001. Signals and slots

  • Result:47points,
  • Rating points-6
Aug. 21, 2019, 10:23 a.m.
Andrej Ermoshin

C++ - Test 002. Constants

  • Result:58points,
  • Rating points-2
Aug. 21, 2019, 10:15 a.m.
Andrej Ermoshin

C++ - Test 001. The first program and data types

  • Result:86points,
  • Rating points6
Last comments
Aug. 19, 2019, 7:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
Aug. 18, 2019, 6:09 a.m.
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
Aug. 17, 2019, 9:04 a.m.
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 1:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 12:16 p.m.
Dmitrij

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 24, 2019, 7:21 a.m.
Evgenij Legotskoj

Не помню, давно уже с QML не работал, по-моему, обычно пишет в консоль, что не находит файл. В любом случае какую-то ошибку в консоль выкидывает. Но если честно, если у вас проект будет ак…
BG
Aug. 24, 2019, 4:27 a.m.
Brjus Gliff

Спасибо, вначале в документации было не понятно что к чему, теперь разобрался
I
Aug. 21, 2019, 8:36 a.m.
Intruder

Александр, мне не нужно перебирать. Вы говорите правильно, сначала я написал избыточный код просто не подумав. Задача такая, мне нужно просто переложить из QMap в атрибуты xml тега все, что там …
Aug. 21, 2019, 3:16 a.m.
nayk1982

Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант: 1. Получить список таблиц через QSqlDatabase::tables 2. Для каждой табли…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB