本文内容
启动和屏幕管理类
注意:本信息面向项目管理器工具的开发人员。如果您是使用项目管理器的用户,请参阅 项目管理器用户指南。
注意:其中包含各种类的功能和作用的简要概述。如果有,目录中还会提供其他链接,包括扩展信息或 github 链接。所有文档反映的代码截至提交 (b79bd3df1f)
概述
Class | Source Code | Description |
---|---|---|
main.cpp | cpp 文件 | 项目管理器的入口点。启动 应用程序主循环 。 |
Application | 头文件 cpp 文件 | 为 Qt 框架、日志、Python Bindngs 和 O3DE 引擎注册提供核心启动代码和配置加载。为启动应用程序主循环的前期工作提供便利,并在拆卸时进行清理。 |
ProjectManagerWindow | 头文件 cpp 文件 | 构建应用程序的 QMainWindow 和 DownloadController ,并为项目管理器准备所有相关的过渡屏幕。 |
ScreensCtrl | 头文件 cpp 文件 | 所有项目管理器屏幕和图形用户界面小工具的容器结构。还包含主要的过渡代码,用于促进项目管理器的业务逻辑。 |
ScreenFactory | 头文件 cpp 文件 | 用于将 ProjectManagerScreen 枚举路由到适当的 ScreenWidget 构造函数的 ScreensCtrl 的辅助类,调用该构造函数,并为项目管理器的业务逻辑返回给定屏幕的实例。 |
ScreenDefs | 头文件 | 包含 ProjectManagerScreen 枚举的定义,该枚举描述了项目管理器中所有可能的屏幕类型。它还为每个枚举定义了哈希函数和相应字符串的映射。 |
ScreenWidget | 头文件 | 项目管理器中所有屏幕的父类。它包含屏幕管理和转换所需的所有存根。 ScreensCtrl 是根据 ScreenWidget 定义的,因此所有转换逻辑都是多态的。 |
Application
继承自AzFramework::Application
。
应用程序类的功能完全由 main.cpp
运行。
需要跟踪的两个主要函数是 Init
和 Run
。在 Application
解构时会调用
TearDown
函数。
Application::Init
- 设置各种
QApplication
和QCoreApplication
属性和参数。 - 为系统日志注册组件,并调用
InitLog
。 - 创建新的
QApplication
实例,输入命令行参数。 - 设置 PythonBindings。
- 调用
RegisterEngine
,设置项目管理器附带的 O3DE 引擎。 - 获取与 CommandLine 的连接,并解析 screen 和 projectPath 参数。
- 创建 ProjectManagerWindow。
Application::Run
- 设置 Qt GUI 样式表。
- 设置窗口装饰和主窗口几何形状。
- 显示主窗口。
- 运行 QApplication 的主循环。
ProjectManagerWindow
它继承了 QMainWindow
的所有主要功能。
项目管理器所特有的所有逻辑都发生在构造函数中,概述如下:
- 获取引擎信息,用正确的引擎版本信息设置窗口标题。
- 实例化
DownloadController
。 - 实例化用于屏幕管理的
ScreensCtrl
。 - 构建相关
ProjectManagerScreen
枚举的列表,并使用ScreensCtrl
为项目管理器的图形用户界面构建每个屏幕部件。 - 将
ScreensCtrl
实例设置为窗口的中心部件。 - 读取传入的
startScreen
和projectPath
参数。- 如果设置了
startScreen
,则首先强制加载项目主屏幕,然后过渡到所需屏幕。如果未设置,则默认为项目屏幕。 - 如果设置了
projectPath
,则通知ScreensCtrl
实例当前高亮显示的项目路径。
- 如果设置了
ScreensCtrl
ScreensCtrl 是一个中央部件,用于存储项目管理器的所有图形用户界面信息。它由以下数据结构组成:
m_screenMap
- 用于访问 “项目管理器 ”中的所有可用屏幕。m_screenStack
- 在QStackedWidget
中存储所有屏幕。m_tabWidget
- 项目管理器的三个主要选项卡(项目、Gem和引擎)都存储在这里。而该选项卡部件则作为m_screenStack
的第一个元素存储。m_screenVisitOrder
- 使用此功能可以跟踪 ProjectManager 屏幕的遍历历史。
所有函数概述如下:
函数 | 说明 |
---|---|
ScreensCtrl::ScreensCtrl | 设置主屏幕布局。m_tabWidget 是推送到 m_screenStack 的第一个部件。 |
ScreensCtrl::BuildScreens | 对于每个请求的屏幕,调用 ResetScreen 。由于该调用是在应用程序生命周期开始时调用的,因此会触发 ResetScreen 中的初始化逻辑。 |
ScreensCtrl::FindScreen | 搜索请求的 ProjectManagerScreen 枚举的 ScreenWidget 指针,如果找到则返回。否则返回一个 nullptr 。 |
ScreensCtrl::GetCurrentScreen | 首先检查 m_screenStack 中的当前 widget 是否为 m_tabWidget 。如果是,则返回 m_tabWidget 的当前标签页。否则,返回 m_screenStack 中的任何当前部件。 |
ScreensCtrl::ChangeToScreen | 如果可以,我们将使用 ForceChangeToScreen 过渡到所需的屏幕。 |
ScreensCtrl::ForceChangeToScreen | 在项目管理器中更改屏幕图形用户界面的驱动程序代码。更多信息请见 下文 |
ScreensCtrl::GoToPreviousScreen | 如果 m_screenVisitOrder 不为空,我们会通过弹出 m_screenVisitOrder 来调用 ForceChangeToScreen 。 |
ScreensCtrl::ResetScreen | 删除旧屏幕并重新创建。更多信息请见 下文 |
ScreensCtrl::ResetAllScreens | 为每个屏幕调用 ResetScreen 。 |
ScreensCtrl::DeleteScreen | 如果可以在 m_screenMap 中找到屏幕,我们将继续从 m_tabWidget 中删除该屏幕(如果它是一个标签页),或者从 m_screenStack 中删除该屏幕(否则)。之后,我们将从 m_screenMap 中删除该条目。 |
ScreensCtrl::DeleteAllScreens | 为所有屏幕调用 DeleteScreen 。 |
ScreensCtrl::TabChanged | Slot 函数 ,在 m_tabWidget 更换标签页时调用。这只会导致当前标签页通过 NotifyCurrentScreen 自行刷新。 |
ScreensCtrl::GetScreenTabIndex | 如果是标签页,则读取屏幕在 m_tabWidget 中的索引位置,否则返回 -1。 |
深入解释
ScreensCtrl::ForceChangeToScreen
- 首先,我们在
m_screenMap
中搜索所需的屏幕。 - 如果我们能找到它,那么如果它已经是当前屏幕,我们就运行
NotifyCurrentScreen
来刷新它。 - 否则,我们将设置
m_screenStack
的当前窗口部件(如果所需的屏幕是主标签页之一,则设置m_tabWidget
)。- 如果我们跟踪的是以前的访问,我们还要确保更新
m_screenVisitOrder
。
- 如果我们跟踪的是以前的访问,我们还要确保更新
- 最后,我们运行
NotifyCurrentScreen
和GoToScreen
为我们的到来做好准备。
ScreensCtrl::ResetScreen
- 使用
DeleteScreen
删除旧屏幕。 - 使用
ScreenFactory::BuildScreen
重新构建屏幕。 - 如果屏幕应该是一个 Tab。
- 用 screen 更新
m_tabWidget
。 - 更新当前 widget
m_tabWidget
和m_screenStack
。 - 如果要恢复屏幕,请调用
NotifyCurrentScreen
。
- 用 screen 更新
- 否则,将屏幕添加到
m_screenStack
并设置当前 widget。- 为新创建的屏幕调用
NotifyCurrentScreen
。
- 为新创建的屏幕调用
- 用指向新屏幕的指针更新
m_screenMap
。 - 为新界面的过渡函数连接插槽。
ScreenWidget
如果要检查头文件,它只会包含存根函数。在本节中,我们将解释每个函数的高层目的,这样就能更容易地识别子类在重写给定函数时要做什么。
Function | Description |
---|---|
ScreenWidget::GetScreenEnum | 每个 ScreenWidget 的子类都将使用此函数来定义当前激活的屏幕类型。 |
ScreenWidget::IsReadyForNextScreen | 用于验证给定的 屏幕是否已准备好进行转换 ,或是否由于某种原因必须暂停(例如,正在执行不可中断的任务)。目前尚未使用。 |
ScreenWidget::IsTab | 此函数声明给定屏幕是否是 m_tabWidget 数据结构中的标签页。在
ScreensCtrl::ForceChangeToScreen 和
ScreensCtrl::DeleteScreen 中,该函数用于将标签页作为边缘情况处理。覆盖此函数的类有
GemCatalogScreen 、
ProjectsScreen 、
ProjectGemCatalogScreen 和
EngineScreenCtrl 。 |
ScreenWidget::GetTabText | 如果子类已定义,则获取选项卡屏幕的相应字符串值。 |
ScreenWidget::ContainsScreen | 项目管理器中存在一些屏幕,如
EngineScreenCtrl ,其内部包含其他较小的屏幕。这可用于检查给定屏幕是否存在于父屏幕内部。 |
ScreenWidget::GoToScreen | 定义一个过渡函数,由子类决定是否移动到某个屏幕。 |
ScreenWidget::Init | 此函数会在
ScreenFactory::BuildScreen 屏幕构造器运行后不久出现。其目的是设置任何无法在构造时完成的系统钩子。这方面的两个例子可以在
CreateAGemScreen 和
EditAGemScreen 中找到,其原理可以在
这里 中找到。 |
ScreenWidget::NotifyCurrentScreen | 屏幕需要刷新时调用的函数。所有必要的刷新逻辑都应在此表达。 |
ScreenWidget
还定义了各种 Qt
signals
,通过连接到 ScreensCtrl::ResetScreen
中定义的 Qt
slots
,这些 Qt
signals
可用于促进转换。