- 1. Beispiel
- 1. Widget.h
- 2. Widget.cpp
- 3. Fazit
Wir alle wissen, dass es in Qt zwei Syntaxen für Signale und Slots gibt:
- Alte Makrosyntax SIGNAL SLOT
- Neue Syntax für Zeiger
Aber genauso wie man Bier nicht mit Wodka mischen sollte, sollte man nicht zwei Syntaxen mit dem gleichen Erfolg innerhalb desselben Projekts mischen.
Natürlich gibt es Projekte, in denen viel Code geschrieben wird und ein vollständiges Refactoring zur Änderung der gesamten Syntax eine ziemliche Overhead-Aufgabe ist, aber wenn Sie das Projekt schrittweise ergänzen und auf eine neue Syntax umstellen, versuchen Sie, alle zu aktualisieren Stellen im Code mit den angegebenen Daten innerhalb eines Slots Verbindungssignal Verbindung zur neuen Syntax.
Tatsache ist, dass für beide Fälle ( SINGAL SLOT-Makros und Syntax auf Zeigern ) ein unterschiedlicher Inhalt von moc-Dateien gebildet wird, was dazu führt, dass die gemischte Verwendung der connect und disconnect funktionieren nicht wie erwartet. Genauer gesagt funktioniert die Methode disconnect nicht, wenn connect mit Makros aufgerufen wurde und disconnect mit Zeigern aufgerufen wurde.
Beispiel
Erstellen wir ein Testprojekt mit einem Fenster und einer Schaltfläche. Lassen Sie uns einen Slot im Fenster hinzufügen. Überprüfen Sie im Fensterklassenkonstruktor vier Kombinationen zum Verbinden des Tastensignals mit dem Fenstersteckplatz:
- SIGNAL SLOT verbinden - SIGNAL SLOT trennen
- Connect SIGNAL SLOT - Trennen Sie die Syntax von Zeigern
- Verbinden auf Schildern - Trennen auf Schildern
- Pointer verbinden - SIGNAL SLOT trennen
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; }
Fazit
First test true true Second test true false Third test true true Fourth test true true
Es stellt sich also heraus, dass das Paar connect SINGAL SLOT - disconnect on pointers nicht das erwartete Ergebnis liefert. Und tatsächlich bleibt der Steckplatz verbunden.
Daher empfehle ich Anfängern, diese Nuance der Arbeit mit Signalen und Slots in Qt sorgfältig zu prüfen.
Who hasn’t mixed beer with vodka! 🤢🤮
vodka + beer = strong coctail, but it is bad ))
disconnect - обязательно делать, во всех случаях?
Если удаляете объект, то все коннекты отключаются автоматически, здесь следить не требуется.