我在Qt
文档中看到了QApplication
的描述,但理解起来不是很清晰。
你能简单地描述一下它主要的作用吗?
谢谢。
关于QApplication最重要的一点是它的exec方法运行事件循环,这基本上是让插槽和信号起作用的软件组成部分。
简单来说,如果没有运行中的事件循环,由GUI组件触发的事件将根本无法传播,因此您的用户界面将不会执行任何操作。
Q*Application
实例是保持 Qt 应用程序运行的核心,通过运行其主事件循环。它处理所有事件(鼠标、键盘、刷新)、信号槽、定时器以及需要某种类型的异步或事件处理 (GUI、OS 等)的绝大部分 Qt 功能。
如果没有 Q*Application,你基本上只能顺序运行 Qt 代码。我的意思是:没有 Qt 定时器,没有操作系统/用户交互。有时候这是需要的,例如在单元测试中。
主线程事件循环会在调用 Q*Application 的 exec()
方法时立即启动,并一直阻塞到应用程序退出。
根据你的应用程序类型,你将需要不同类型的类,以避免拉取不必要的依赖项:
QCoreApplication
QGuiApplication
QApplication
通常,你首先创建 Q*Application,根据需要初始化应用程序的 "静态" 部分,然后调用 qApp->exec()
运行主事件循环。该函数将阻塞,直到你的应用程序关闭。
int main(int argc, char *argv[]) {
// Q[Core|Gui|)Application
QCoreApplication app(argc, argv);
// Load critical settings i.e. minimal config files, GUI, etc.
// Remember no events, timers, and signals slots will work at that stage
QSettings settings(...);
// Start the QApplication
// Will return once the application closes (forced, or by user)
return app.exec();
}
在应用程序中只应存在一个QApplication
。您可以使用它的局部变量或全局指针qApp
来控制它。
按照 QApplication
类的文档:
QApplication
主要负责如下:
- 使用用户的桌面设置初始化应用程序,例如调色板(palette())、字体(font())和双击间隔(doubleClickInterval())。如果用户全局更改了桌面设置(例如通过某种控制面板),则它会跟踪这些属性。
- 处理事件,即接收来自底层窗口系统的事件并将其分派给相关小部件。使用 sendEvent() 和 postEvent() 您可以向小部件发送自己的事件。
- 解析常见命令行参数并根据其设置内部状态。有关更多详细信息,请参阅下面的构造函数文档。
- 定义应用程序的外观和感觉,其中封装在 QStyle 对象中。可以使用 setStyle() 在运行时更改此设置。
- 指定应用程序如何分配颜色。有关详细信息,请参见 setColorSpec()。
- 提供用户可见的字符串的本地化,通过 translate() 方法实现。
- 提供一些神奇的对象,如 desktop() 和 clipboard()。
- 了解应用程序的窗口。可以使用 widgetAt() 查找特定位置的小部件、获取 topLevelWidgets() 列表和 closeAllWindows() 等。
- 管理应用程序的鼠标指针处理,参见 setOverrideCursor()
您可以重写其中之一方法 QApplication::event
,从而完全控制应用程序中所有事件的处理方式。这可以通过继承它或使用 installEventFilter() 方法来完成。
它是非面向对象语言中存在的所有应用程序级全局状态的占位符。
QApplication
取代了所有这些全局状态。 - Ignacio Vazquez-AbramsQApplication
的成员,你会意识到在C语言应用程序中,大多数成员将是全局变量或函数,而不是集中在一个对象中。 - Ignacio Vazquez-Abrams