Вопрос

Допустим, у меня в приложении 2 окна и за них отвечают два класса:class MainWindow: public QMainWindow и class SomeDialog: public QWidget.

В главном окне у меня есть кнопка.При нажатии на него мне нужно отобразить второе окно.Я делаю это следующим образом:

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

Теперь пользователь что-то делает в окне и закрывает его.На данный момент я хочу получить некоторые данные из этого окна, а затем, полагаю, мне придется delete dlg.Но как мне поймать событие закрытия этого окна?

Или есть другой способ избежать утечки памяти?Возможно, было бы лучше создать экземпляр каждого окна при запуске, а затем просто Show()/Hide() их?

Как мне вести такой случай?

Это было полезно?

Решение

Я думаю, вы ищете флаг окна 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.

Другие советы

Рекомендуется использовать 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
}

Подкласс от 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 ()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top