我是QML/QtQuick2的新手,我非常喜欢它。为了开始掌握它,我正在实现一个小的全屏游戏。我的想法是有一个(简单的)游戏,当用户按下ESC键时,弹出一个带有一些设置的图形菜单。
现在我已经运行了所有的基础知识,但我不能完全确定哪种方式是管理菜单和来回传递键盘焦点的最佳声明性方式。最好是静态地创建菜单并将其隐藏在我的主文件中,如下所示:
MyMenuSystem {
visible: false
}
然后在我需要的时候将它设置为“可见”?或者推迟加载,然后使用Loader并创建一个新实例?为了简洁,我更喜欢在QML代码中声明它,但这里的最佳实践是什么?或者,有没有什么组件可以在视图之间切换,而我完全没有?我几乎找不到关于这个主题的信息和例子。谢谢!
发布于 2018-04-20 22:01:21
你的问题有点宽泛,可能会导致固执己见的答案,但由于这是我最关心的话题,我想我应该试着给出一些建议。
加载器
我倾向于只在我需要加载的项目只在某些情况下相关时才使用Loader。例如,如果打开的文档不支持某个特性,则可以将表示该特性的UI元素放入Loader中。这样做的一个好处(除了(通常)非常小的性能提升之外)是,它避免了为该功能添加大量空检查的需要。例如,如果在这种情况下不使用Loader,您可能会得到许多如下所示的代码:
text: optionalFeature.foo ? optionalFeature.foo.bar : ""
使用Loader,您可以控制何时加载项目,以便只有在启用可选功能时才会加载项目。然后代码就变得更好了:
text: optionalFeature.foo.bar
弹出窗口
对于游戏中的菜单,我会使用Popup
。如果您希望用户能够在后台看到游戏,这是很好的,不过如果您愿意,您也可以使用overlay来掩盖这一点。
StackView
如果你不想使用弹出窗口,那么我建议你使用StackView
。无论如何,你可能应该在游戏中的每个屏幕上使用它,因为它非常适合它。
发布于 2018-04-21 15:55:27
下面是我如何实现菜单系统:我使用component创建一个组件,并使用createObject()将其转换为该组件实例。
MyMenu.qml:
import QtQuick 2.9
Popup {
/* Menu Item 1 */
/* etc etc */
}
Game.qml:
Component {
id: myMenuId
MyMenu {
}
}
Game {
id: myGameId
property var dynamicItem
Keys.onPressed: {
if (event.key == Qt.Key_ESC) {
dynamicItem = myMenuId.createObject(myGameId);
dynamicItem.open()
}
}
}
https://stackoverflow.com/questions/49942551
复制相似问题