如何正确清理QWidget /管理一组窗口?

时间:2012-07-27 11:47:25

标签: c++ qt user-interface qwidget window-management

假设我的应用程序中有2个窗口,并且有两个类负责它们: class MainWindow: public QMainWindowclass SomeDialog: public QWidget

在我的主窗口中,我有一个按钮。单击它时,我需要显示第二个窗口。我是这样做的:

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

现在,用户在窗口中执行某些操作并关闭它。此时我想从该窗口获取一些数据,然后,我想,我将不得不delete dlg。但是如何捕捉该窗口关闭的事件?

或者还有其他方法没有内存泄漏?也许最好在启动时创建每个窗口的实例,然后只是Show() / Hide()它们?

我该如何管理这种情况?

3 个答案:

答案 0 :(得分:3)

建议您使用show() / exec()hide(),而不是每次要显示时动态创建对话框。也可以使用QDialog代替QWidget

在主窗口的构造函数中创建并隐藏它

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
}

答案 1 :(得分: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 ()

答案 2 :(得分: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.