断开信号失败

Disconnecting signals fails

本文关键字:失败 信号 断开      更新时间:2023-10-16

在我的代码中,我想重新路由信号时隙连接,即首先将时隙连接到信号 1,在重新路由之后,它应该只连接到信号 2。为此,我使用了disconnect(this)this指的是拥有插槽的类(它在类函数中)。此命令应断开来自 extern 的所有信号与类的连接。 不幸的是,我得到false作为disconnect()的返回值。为什么我无法断开信号?是否有可能获得更多信息?
奇怪的是,在下面的示例中,断开连接和重新连接也不起作用,我从disconnect那里得到相同的错误代码。
如果我从 on_PushButton2_clicked() 函数中删除行connect(this, &MainWindow::writeLine, class1, &TXClass::emit_signal);disconnect()仍然返回"false",但我得到了预期的结果。

示例代码:
主窗口.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    class1 = new TXClass("Class 1");
    class2 = new TXClass("Class 2");
    connect(this, SIGNAL(writeLine()), class1, SLOT(emit_signal()));
    connect(class1, SIGNAL(signal(QString)), this, SLOT(newText(QString)));
}
MainWindow::~MainWindow()
{
    delete class1;
    delete class2;
    delete ui;
}
void MainWindow::newText(QString text)
{
    ui->lineEdit->setText(text);
}
void MainWindow::on_pushButton_clicked()
{
    emit writeLine();
}
void MainWindow::on_pushButton_2_clicked()
{
    qDebug() << "Disconnect result: " << disconnect(this);
    connect(this, &MainWindow::writeLine, class2, &TXClass::emit_signal);
    connect(this, &MainWindow::writeLine, class1, &TXClass::emit_signal);
    connect(class2, &TXClass::signal, this, &MainWindow::newText);
    //The onliest signal I want to get now is from class2.
}

MainWindow.h:

#include <QDebug>
#include <txclass.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
signals:
    void writeLine(void);
public slots:
    void on_pushButton_clicked();
    void newText(QString text);
    void on_pushButton_2_clicked();
private:
    Ui::MainWindow *ui;
    TXClass *class1, *class2;
};
#endif // MAINWINDOW_H

TXClass.cpp:

#include "txclass.h"
TXClass::TXClass(QString name)
{
    TXClass::name = name;
}

void TXClass::emit_signal()
{
    emit signal(name);
}

TXClass.h:

#ifndef TXCLASS_H
#define TXCLASS_H
#include <QObject>
class TXClass : public QObject
{
    Q_OBJECT
private:
    QString name;
signals:
    void signal(QString string);
public slots:
    void emit_signal(void);
public:
    TXClass(QString name);
};
#endif // TXCLASS_H

我已经检查了QObject::disconnect是如何实现的,如果您只指定接收器,我看不出这应该如何工作。QMetaObjectPrivate::d isconnect 将在未指定发送方时立即返回 false。这意味着 QObject::d isconnect 的第二部分不会res设置为 true。唯一可以真正得到的地方是调用QInternal::activateCallbacks。但它看起来不像是特定于实例的,而是一些全局的东西(我承认我不知道这到底应该做什么:/)。

我有效且看起来足够好的解决方案是这样的:

void MainWindow::second()
{
    qDebug() << "Disconnect result: " << class1->disconnect();
    connect(this, &MainWindow::writeLine, class2, &TXClass::emit_signal);
    connect(this, &MainWindow::writeLine, class1, &TXClass::emit_signal);
    connect(class2, &TXClass::signal, this, &MainWindow::newText);
    //The onliest signal I want to get now is from class2.
}