There is the main window MainWindow, there is its child window, which is created in the slot of the main window MainWindow - MapsManager (this). The problem is that if the child window is open and I click on the cross of the main window (well, Iβm trying to close the main window, which means the entire application window), then Iβll go to the MainWindow destructor, then MapsManager destructor, then lambda, there kicks out a segfolt on any line with access to ui. Why does the MainWindow destructor work before the child?
void MainWindow::slotMapsManager() { // ΠΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠ°ΡΡ if(mapsManagerPtr_) return; if(foundPointPtr_) foundPointPtr_->close(); WaterBody::getInstance().hidePoint(); // Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΠΎΡΠ½ΠΎΡΡΡ ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²ΠΊΠΈ, setWindowState(Qt::WindowMaximized); // ΠΠ°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° setFixedSize(width(), height()); // ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΡΠ΅ΠΊ ui->pushButtonCreateGamePoint->setEnabled(false); ui->pushButtonFindGamePoint->setEnabled(false); ui->menuBar->setEnabled(false); ui->lineEditPointX->setValidator(new QIntValidator(0, 9999, this)); ui->lineEditPointY->setValidator(new QIntValidator(0, 9999, this)); ui->lineEditPointX->setReadOnly(true); ui->lineEditPointY->setReadOnly(true); ui->lineEditPointX->clear(); ui->lineEditPointY->clear(); mapsManagerPtr_ = new MapsManager(this); // Π‘ΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π» Π·Π°ΠΊΡΡΡΠΈΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Ρ Π»ΡΠΌΠ±Π΄ΠΎΠΉ connect(mapsManagerPtr_, &MapsManager::destroyed, this, [this]() { // ΠΠ΅ΡΠ½ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Π΄Π»Ρ ΠΎΡΠΌΠ΅Π½Ρ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); setMinimumSize(MINIMUM_WIDTH, MINIMUM_HEIGHT); //WaterBody::getInstance().showPoint(); // ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΡΠ΅ΠΊ ui->pushButtonCreateGamePoint->setEnabled(true); ui->pushButtonFindGamePoint->setEnabled(true); ui->menuBar->setEnabled(true); // ΠΠ°Π»ΠΈΠ΄Π°ΡΠΎΡ Π΄Π»Ρ ΠΏΠΎΠ»Π΅ΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ. ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠΈΠ½ΡΡ, Π·Π°ΡΠ΅ΠΌ 0-999 ui->lineEditPointX->setValidator(new QRegExpValidator(QRegExp("(-\\d{2})|(\\d{3})"), this)); ui->lineEditPointY->setValidator(new QRegExpValidator(QRegExp("(-\\d{2})|(\\d{3})"), this)); ui->lineEditPointX->setReadOnly(false); ui->lineEditPointY->setReadOnly(false); ui->lineEditPointX->clear(); ui->lineEditPointY->clear(); }); mapsManagerPtr_->show(); }