2017-09-25 2 views
1

Qtアプリケーションに親子ウィンドウがあります。親クラスはQDialogであり、子クラスはQMainWindowで、名前はBです。今度は、Bが「X」ボタンで閉じられると、クラスAのスロットで捕捉できるシグナルが放出されることを望みます実装される機能私は使用できるQtにあらかじめ定義されたシグナルがありますか?子ウィンドウが親ウィンドウの形で破棄されていることを知る方法

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

Bはまた、私は破壊された信号を検出するために使用することができますQWidgetあります

は、私はこのような何かをしたいです。これをどのように実装すればよいですか? ~B()からカスタム信号を送信する必要がありますか?

編集:私はAから窓Bを再作成したいと私はbのパラメータを維持したいとき、これは再割り当てを必要とするように、オブジェクトbを破壊する必要はありません。

b->setAttribute(Qt::WA_DeleteOnClose); 

別のオプションは、close eventを再実装し、そこに独自の信号を発するようになります:あなたset a Qt::WA_DeleteOnClose attribute場合

+0

[Qt:ユーザーが 'X'(閉じる)ボタンを押した場合の対処方法を教えてください。](https://stackoverflow.com/questions/17480984/qt-how-do-i-handle -the-user-pressed-the-x-close-buttonのイベント) – Thrawn

答えて

2

あなたのソリューションは、あなたのBウィジェットに働くだろう。

+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

@AbhishekAgarwalここからサンプルアプリケーションをダウンロードしてください:https://www.mediafire.com/file/ 7f0434k0qdsv1pz/DestroyWidget.rar – aghilpro

+0

これは、@ thugaの答えで与えられた 'setAttribute'コマンドを追加した後に動作します。これを答えに加えてください。 –

+0

@AbhishekAgarwal私はちょうどそれをテストします、 'setAttribute'なしで動作しています' delete widget; '行で削除します – aghilpro

関連する問題