3

アプリケーションに 2 つのウィンドウがあり、それらを担当する 2 つのクラスがある class MainWindow: public QMainWindowとしclass SomeDialog: public QWidgetます。

私のメインウィンドウにはボタンがあります。クリックすると、2 番目のウィンドウを表示する必要があります。私はこのようにします:

SomeDialog * dlg = new SomeDialog();
dlg.show();

ここで、ユーザーはウィンドウで何かを行い、ウィンドウを閉じます。この時点で、そのウィンドウから何らかのデータを取得したいと考えていdelete dlgます。しかし、そのウィンドウが閉じられたというイベントをどのようにキャッチしますか?

または、メモリリークを起こさない別の方法はありますか? たぶん、起動時に各ウィンドウのインスタンスを作成してから、Show()/Hide()それらだけを作成する方がよいでしょうか?

このような場合はどのように対処すればよいですか?

4

3 に答える 3

3

ダイアログを表示するたびに動的に作成する代わりに、show()/ exec()andを使用することをお勧めします。の代わりにhide()も使用します。QDialogQWidget

メインウィンドウのコンストラクターで作成して非表示にします

MainWindow::MainWindow()
{
     // myDialog is class member. No need to delete it in the destructor
     // since Qt will handle its deletion when its parent (MainWindow)
     // gets destroyed. 
     myDialog = new SomeDialog(this);
     myDialog->hide();
     // connect the accepted signal with a slot that will update values in main window
     // when the user presses the Ok button of the dialog
     connect (myDialog, SIGNAL(accepted()), this, SLOT(myDialogAccepted()));

     // remaining constructor code
}

ボタンのclicked()イベントに接続されたスロットでそれを表示し、必要に応じてダイアログにデータを渡します

void myClickedSlot()
{
    myDialog->setData(data);
    myDialog->show();
}

void myDialogAccepted()
{
    // Get values from the dialog when it closes
}
于 2012-07-27T11:56:37.597 に答える
2

からサブクラス化しQWidgetて再実装する

virtual void QWidget::closeEvent ( QCloseEvent * event )

http://doc.qt.io/qt-4.8/qwidget.html#closeEvent

また、表示したいウィジェットはダイアログのようです。したがって、QDialogまたはそのサブクラスの使用を検討してください。QDialog接続できる便利な信号があります。

void    accepted ()
void    finished ( int result )
void    rejected ()
于 2012-07-27T11:49:41.520 に答える
1

Qt::WA_DeleteOnClose ウィンドウ フラグを探していると思います: http://doc.qt.io/archives/qt-4.7/qt.html#WidgetAttribute-enum

QDialog *dialog = new QDialog(parent);
dialog->setAttribute(Qt::WA_DeleteOnClose)
// set content, do whatever...
dialog->open();
// safely forget about it, it will be destroyed either when parent is gone or when the user closes it.
于 2012-07-27T17:49:44.340 に答える