2017-09-25 137 views
1

我在我的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因为这需要重新分配时,我想重新从A窗口B,我想保持b参数。

b->setAttribute(Qt::WA_DeleteOnClose); 

另一种选择是重新实现close event,放出自定义信号有:如果你set a Qt::WA_DeleteOnClose attributeB部件

+0

[Qt:如何处理用户按'X'(关闭)按钮的事件?](https://stackoverflow.com/questions/17480984/qt-how-do-i-handle用户按下-x-关闭按钮) – Thrawn

回答

2

您的解决方案只会工作。

+0

因此,当窗口被破坏时没有内置信号发出? –

+0

我的代码中的行在编译时给我编译错误 –

+0

您正在将新的连接语法与旧的语法混合。 – thuga

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

+0

@AhhishekAgarwal下载示例应用程序在这里:https://www.mediafire.com/file/ 7f0434k0qdsv1pz/DestroyWidget.rar – aghilpro

+0

在@thuga的回答中添加'setAttribute'命令之后,它可以工作。请将此添加到答案中。 –

+0

@AbhishekAgarwal我只是测试它,它的工作没有'setAttribute'我删除线'删除小部件;' – aghilpro