void MainMenuWnd::LoginFinished(){ if(currentEmployee == NULL) { qDebug() << "close MainWnd"; //this->setHidden(false); this->close(); } else {/*some code*/}}
QTimer::singleShot(0, this, SLOT(close()));
class LoginWnd : public QDialog{ Q_OBJECTpublic: explicit LoginWnd(CEmployee* employee, QWidget *parent = 0); ~LoginWnd();private slots: void on_EnterBtn_clicked(); void CloseWnd();//вот в этом слоте происходит удаление указателяprivate: Ui::LoginWnd *ui; CEmployee *employee;};
LoginWnd::LoginWnd(CEmployee *employee1, QWidget *parent) : QDialog(parent), ui(new Ui::LoginWnd){ //... employee = employee1;}//...void LoginWnd::CloseWnd(){ delete employee; employee = NULL; this->close();//обнулил, закрыл, здесь все корректно работает, никаких багов не наблюдалось}
class MainMenuWnd : public QMainWindow{ Q_OBJECTpublic: explicit MainMenuWnd(QWidget *parent = 0); virtual ~MainMenuWnd();private: Ui::MainMenuWnd *ui; CEmployee *currentEmployee; LoginWnd* LogWnd;private slots: void LoginFinished();//вызывается сразу же, как окно авторизации закрылось};
MainMenuWnd::MainMenuWnd(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainMenuWnd){ ui->setupUi(this); currentEmployee = new CEmployee();//... LogWnd = new LoginWnd(currentEmployee); connect( LogWnd, SIGNAL(finished(int)), this, SLOT(LoginFinished()) ); this->hide(); LogWnd->exec();}//...void MainMenuWnd::LoginFinished(){ if(currentEmployee == 0) { this->setHidden(false); this->close(); //вот тут окно не закрывается. Пробовал и раскрывать/не раскрывать - никаких результатов //с помощью qDebug() проверял, что в этот if заходит, когда выполнены соответствующие действия //QTimer::singleShot(0, this, SLOT(close())); //с помощью таймера решил проблему, но на защите могут из-за него завалить + окошко мигает при закрытии } else { //some code }}