You want to use signals and slots to communicate between the windows. QDialog provides three important signals in particular: accepted(), rejected(), finished(int). So you'll want to do something like this:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// set login screen on startup
QWidget *login = new Login(this);
connect(login, SIGNAL(finished(int)), this, SLOT(loginFinished(int)));
setCentralWidget(login);
}
MainWindow::loginFinished(int reason)
{
Login *login = qobject_cast<Login*>(sender());
if (!login) {
qDebug() << "something bad happened!";
return;
}
login->deleteLater();
setCentralWidget(someOtherWidget);
}