当我们设计Qt界面应用时,不免会对下面代码非常熟悉。QApplication作为整个GUI应用的入口点,想必是完成各种初始化,并开始主循环,各种东西。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//......
return a.exec();
}
- 无论有多少个windows,一个应用中只会存在一个QApplication对象。若应用无需用QWidget类,则应该用QGuiApplication来代替QApplication,以减少一些无谓的初始化。
- QGuiApplication负责事件的处理,即QApplication会接收来自底层窗口系统的事件,并将它们分发给相应的小部件(widgets)。通过调用sendEvent() 和 postEvent(),开发者可以发送自定义的事件到widgets上。
- QApplication定义了应用程序的外观,并将相关属性封装在QStyle对象中。这可以在运行时使用setStyle()进行更改。(提供各种功能,详见文档)
- 由于QApplication对象进行了大量初始化工作,因此必须在创建与用户界面相关的任何其他对象之前创建它。QApplication还会处理常见的命令行参数。因此,可以在应用程序本身中对argv进行任何解释或修改之前创建QApplication。
接下来看看[static] int QApplication::exec()
- 通常在调用exec()之前不能进行任何的用户交互,因为该函数会启动事件处理,将来自底层窗口系统的事件分发给各控件。但也存在一个例外,在调用exec()之前可以使用QMessageBox(即消息弹窗)之类的模式小部件,因为模式小部件可以调用Dialog::exec()来启动本地事件循环。
- Qt建议将清理代码连接到aboutToQuit()信号上,而不是将其放入应用程序的main()函数中。这是因为在某些平台上,QApplication::exec()调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,不能保证应用程序在QApplication::exec()调用之后有时间退出其事件循环并执行exec后的代码。