QT SLOT called 1,2,3... times

QT SLOT called 1,2,3... times

本文关键字:times SLOT called QT      更新时间:2023-10-16

我正在连接一个信号/插槽,但每次触发该选项时,该插槽都会被调用多次(1、2、3…),以下是我的类:

主窗口.h:

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
    Dialog *dialog;
signals:
    void s1(QString s);
private slots:
    void on_actionTooo_triggered();
};
#endif // MAINWINDOW_H

mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_actionTooo_triggered()
{
    dialog = new Dialog(this);
    QString s = "hello";
    qDebug() << "CONNECT: " << connect(this, SIGNAL(s1(QString)),
            dialog, SLOT(s1(QString)), Qt::UniqueConnection);
    emit s1(s);
    dialog->show();
}

对话框.h:

class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
public slots:
    void s1(QString str);
private:
    Ui::Dialog *ui;
};

dialog.cpp:

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::s1(QString str)
{
    qDebug() << str << endl;
}

每次在主窗口中触发该选项时,我都会将信号(仅一次)连接到新对话框,但当我运行时,例如两次时,它会打印两个"你好"。如果我在连接信号之前放一个disconnect(this, 0, 0, 0);,它就会工作。

即使对象被破坏,它也能保持连接,这对我来说似乎很奇怪。它将连接绑定到之前创建的同一对象。这是预期的行为吗?

每次调用on_actionTooo_triggered()时都会创建一个新的Dialog。此Dialog不会在函数结束时删除。因此,对于下一次呼叫,信号MainWindow::s1(QString)被发射到两个不同的Dialogs,这导致qDebug中的多个耦合。

void MainWindow::on_actionTooo_triggered()
{
    dialog = new Dialog(this);
    QString s = "hello";
    qDebug() << "CONNECT: " << connect(this, SIGNAL(s1(QString)),
            dialog, SLOT(s1(QString)), Qt::UniqueConnection);
    emit s1(s);
    dialog->show();
}

此代码每次触发时都会创建一个新对话框,并在新创建的对话框和MainWindow之间建立连接。虽然连接被指定为"唯一",但每次都会创建一个新的对话框,因此连接不是唯一的,因为对话框实例不同。

您的代码不会显示对话框正在被删除,即使关闭了它的窗口,实例仍保留在内存中,因此多个对象接收到相同的信号。

您的Dialog在该代码中从未被销毁。当您在Dialog的构造函数中将this作为父级传递时,它甚至不会泄漏,这使得MainWindow负责这个Dialog内存。

因此,您永久性地创建了额外的Dialog,该插槽将被触发,从而解释了为什么您看到输出的重复递增。