最近因项目需求,Qt程序一旦检测到错误,要重新启动,自己是每次关闭主窗口的所有子窗口但有些模态框会出现问题,因此从网上总结了一些知识点,以备以后的应用。
int main(int argc, char *argv[]) { QApplication a(argc, argv); MyWidget w; MyDialog dialog; //新建MyDialog类对象 if(dialog.exec()==QDialog::Accepted){ //判断dialog执行结果 w.show(); //如果是按下了“进入主界面”按钮,则显示主界面 return a.exec(); //程序正常运行 } else return 0; //否则,退出程序 }执行到a.exec()才能启动主线程的事件循环,退出循环既要退出这个事件循环返回a.exec()的值或者0。
(2)主界面的退出
主窗口右下角的退出方式一:QCoreApplication::exit(0);0是状态还可以是其他的值。
方式二:QCoreApplication::quit();
方式三:QApplication::exit(0);QApplication是继承QCoreApplication的。
方式四:QApplication::quit();
方式五:close();QApplicatio有个常用属性qApp->quitOnLastWindowClosed(true);当最后一个窗口关闭时自动调用前面的exit()。
方式六:QApplication::closeAllWindows();关闭多个窗口,比调用quit好,因为窗口可以接受到close事件。
当然也可以循环关闭所有的QWidget窗口:
QObjectList list = MainWindow->children(); foreach(QObject *obj, list) { if (qobject_cast<QWidget *>(obj)) { QObjectList list_son = qobject_cast<QWidget *>(obj)->children(); foreach(QObject *obj_son, list_son) { if (qobject_cast<QWidget *>(obj_son)) { qobject_cast<QWidget *>(obj_son)->close(); } } qobject_cast<QWidget *>(obj)->close(); } }
只关闭所有的QDialog窗口:
QObjectList list = this->children(); foreach(QObject *obj, list) { if (qobject_cast<QDialog *>(obj)) { QObjectList list_son = qobject_cast<QDialog *>(obj)->children(); foreach(QObject *obj_son, list_son) { if (qobject_cast<QDialog *>(obj_son)) { qobject_cast<QDialog *>(obj_son)->close(); } } qobject_cast<QDialog *>(obj)->close(); } }
(3)重启程序之一
使用QProcess启动当前程序的另一个进程,这两个程序没有父子关系。
点击重启按钮,其槽中内容
void MyWidget::slotButton() { qApp->closeAllWindows(); QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }也可以使用QProcess::startDetached(qApp->applicationFilePath());但要保证路径中不包括空格也无参数。
qApp->quit();与qApp->closeAllWindows();都可以使用,只是看是否接受close事件。
(4)重启程序之二
在上述的槽中书写:
void MyWidget::slotButton() { // qApp->closeAllWindows(); // QProcess::startDetached(qApp->applicationFilePath(), QStringList()); qApp->exit(0); }
在main函数中
int main(int argc, char *argv[]) { QApplication a(argc, argv); int ret; MyWidget w; MyDialog dialog; //新建MyDialog类对象 if(dialog.exec()==QDialog::Accepted){ //判断dialog执行结果 w.show(); //如果是按下了“进入主界面”按钮,则显示主界面 ret = a.exec(); //程序正常运行 } else return 0; //否则,退出程序 if (ret == 0) { QProcess::startDetached(qApp->applicationFilePath(), QStringList()); return 0; } return ret; }注意exit的返回值与ret的判断值要一样才能重启动。
(1)本人喜欢使用重启程序之一,位置简单,在需要重启的地方直接加入就行。
(2)本次测试代码比较简单,暂不上传,需要的可以联系。
(3)本人思路有限,若有更好的设计建议,也可发邮件沟通,在此先感谢!邮箱地址[email protected]。