Como limpar adequadamente um QWidget/gerenciar um conjunto de janelas?
-
12-12-2019 - |
Pergunta
Digamos que eu tenha 2 janelas na minha aplicação e duas classes responsáveis por elas:class MainWindow: public QMainWindow
e class SomeDialog: public QWidget
.
Na minha janela principal eu tenho um botão.Quando for clicado, preciso exibir a segunda janela.Eu faço assim:
SomeDialog * dlg = new SomeDialog();
dlg.show();
Agora o usuário faz algo na janela e a fecha.Neste ponto, quero obter alguns dados dessa janela e, então, suponho, terei que delete dlg
.Mas como faço para capturar o evento dessa janela ser fechada?
Ou existe outra maneira de não haver vazamento de memória?Talvez fosse melhor criar uma instância de cada janela na inicialização e depois apenas Show()
/Hide()
eles?
Como faço para gerenciar esse caso?
Solução
Acho que você está procurando o sinalizador da janela 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.
Outras dicas
É aconselhável usar show()
/ exec()
e hide()
em vez de criar dinamicamente a caixa de diálogo sempre que quiser mostrá-la.Use também QDialog
em vez de QWidget
.
No construtor da sua janela principal, crie-o e oculte-o
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
}
No slot conectado aos botões clicked()
evento simplesmente mostre-o e, se necessário, passe alguns dados para a caixa de diálogo
void myClickedSlot()
{
myDialog->setData(data);
myDialog->show();
}
void myDialogAccepted()
{
// Get values from the dialog when it closes
}
Subclasse de QWidget
e reimplementar
virtual void QWidget::closeEvent ( QCloseEvent * event )
http://doc.qt.io/qt-4.8/qwidget.html#closeEvent
Além disso, parece que o widget que você deseja mostrar é uma caixa de diálogo.Então considere usar QDialog
ou são subclasses. QDialog
tem sinais úteis aos quais você pode se conectar:
void accepted ()
void finished ( int result )
void rejected ()