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?

Foi útil?

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 ()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top