3

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

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

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

现在,用户在窗口中做一些事情,然后关闭它。此时我想从那个窗口获取一些数据,然后,我想,我将不得不delete dlg. 但是我如何捕捉到那个窗口被关闭的事件呢?

还是有另一种不发生内存泄漏的方法?也许在启动时创建每个窗口的实例会更好,然后就Show()/Hide()他们?

我该如何处理这种情况?

4

3 回答 3

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
}
于 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 回答