【问题标题】:QT SLOT called 1,2,3... timesQT SLOT 调用 1,2,3... 次
【发布时间】:2014-10-20 16:20:53
【问题描述】:

我正在连接一个信号/插槽,但每次触发该选项时都会多次调用该插槽(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

主窗口.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();
}

dialog.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;
}

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

我觉得奇怪的是,即使对象被销毁,它仍然保持连接。它将连接绑定到之前创建的同一个对象。这是预期的行为吗?

【问题讨论】:

    标签: c++ qt qt-creator


    【解决方案1】:

    每次调用on_actionTooo_triggered() 时,您都会创建一个新的Dialog。这个Dialog 不会在你的函数结束时被删除。因此,在下一次调用中,信号 MainWindow::s1(QString) 被发送到两个不同的 Dialogs,从而导致 qDebug 中的多个输出。

    【讨论】:

      【解决方案2】:
      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();
      }
      

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

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

      【讨论】:

        【解决方案3】:

        您的Dialog 在此代码中永远不会被破坏。当您在Dialog 的构造函数中将this 作为父级传递时,它甚至不会泄漏,这使得MainWindow 负责此Dialog 内存。

        因此,您将永久创建额外的Dialog,将触发哪个槽,从而解释为什么您会看到输出的重复增加。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          • 2021-09-03
          • 2014-04-20
          相关资源
          最近更新 更多