如何知道子窗口从父窗口被销毁

时间:2017-09-25 10:17:46

标签: c++ qt

我的Qt应用程序中有一个父子窗口。父类是名为A的QDialog,名为B的子类是QMainWindow。现在我希望每当B通过' X'按钮将发出一个信号,该信号可以被A类中的一个插槽捕获,我希望通过该插槽实现某些功能。在我可以使用的Qt中是否有预定义的信号?

我想要这样的事情:

B *b=new B;
//some code
connect(b,SIGNAL(destroyed()),this,&A::doSomething);

B还有一个QWidget我可以用它来检测被破坏的信号。我该如何实现?我是否需要从~B()发出自定义信号?

编辑:我不想破坏对象b,因为当我想从{{1}重新创建窗口B时需要重新分配我希望保留A的参数。

2 个答案:

答案 0 :(得分:2)

只有当set a Qt::WA_DeleteOnClose attribute B小部件

时,您的解决方案才有效。

b->setAttribute(Qt::WA_DeleteOnClose);

另一个选择是重新实现close event并在那里发出自定义信号。

答案 1 :(得分:1)

像这样连接你的对象:

widget = new QWidget();
//widget->show(); //optional using
connect(widget, &QWidget::destroyed, this, &MainWindow::widgetDestroy);
widget->setAttribute(Qt::WA_DeleteOnClose);

.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::on_pushButtonNew_clicked()
{
    widget = new QWidget();
    widget->show();
    connect(widget, &QWidget::destroyed, this, &MainWindow::widgetDestroy);
    widget->setAttribute(Qt::WA_DeleteOnClose);
}

void MainWindow::on_pushButtonDel_clicked()
{
    delete widget;
}

void MainWindow::widgetDestroy()
{
    qDebug()<< "deleted."; //after destroy widget this function calling.
}

.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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


private slots:

    void widgetDestroy();

    void on_pushButtonNew_clicked();

    void on_pushButtonDel_clicked();

private:
    Ui::MainWindow *ui;
    QWidget *widget;
};

#endif // MAINWINDOW_H

.ui:

enter image description here