程序有一个主窗口,在主窗口显示前有一个登陆窗口,登陆成功后显示主窗口,登陆失败退出程序
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//使用类QSplashScreen
//加载程序启动画面:
QSplashScreen *splash = new QSplashScreen;
splash->setPixmap(QPixmap(":/images/test.png"));
splash->show();
Qt::Alignment topRight = Qt::AlignCenter;//Qt::AlignRight|Qt::AlignTop;
splash->showMessage(QObject::tr("正在启动程序..."), topRight,Qt::black);
MainWindow w;
w.connectDatabase();//连接数据库
.......
w.showMaximized();
splash->finish(&w);//在主窗口加载完成后释放启动画面资源
delete splash;
if()//连接失败
{
w.close();
a.quit();
return 0;//如果没有连接上数据库,则不会进入主窗口,整个程序结束运行
}
w.initMembers();//初始化主界面
return a.exec();//程序一直运行,直到主窗口关闭
}
别人的实现方法:
main.cpp
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.login();
return a.exec();
}
MainWindow.cpp中的login过程和关闭是这样的
void MainWindow::login() {
Login l;
if (l.exec() == QDialog::Accepted) {
l.hide();
this->show();
} else {
this->close();
}
}
void MainWindow::closeEvent(QCloseEvent *event) {
event->accept();
}
感觉逻辑上很正确,就是登陆不成功,窗口都退出了,进程依然在内存中运行,使用用qApp->quit();也不能使进程结束。翻阅资料才明白,l.exec() 是模态对话框,在执行退出程序的close quit等函数时,a.exec()还没有执行,事件循环还没有建立,所有退出事件都不起作用。最后用了这样的机制才达到如期目的:
main函数不变化
login变成:
MainWindow::~MainWindow() {
delete l;
}
void MainWindow::login(){
l->show();
}
void MainWindow::loginFinshed(bool ok){//login发射loginFinshed信号
if(ok){
l->hide();
this->show();
}else{
qApp->quit();
}
}