我正在使用 qml 在 Qt/C++ 中制作棋盘游戏。所有重要的游戏数据都在一个类中表示。我的意图是让 qml 表访问这个对象并根据数据绘制游戏板。
将 C++ 数据成员暴露给 QML 的最简单方法是什么?
现在我知道这个问题已经被问过了,我已经看到了答案和 Qt 文档。然而,我并不满意。我所看到的,这样做的方法似乎是将 Q_PROPERTY 从我想从 QML 访问的每个变量中取出。这在我看来是乏味和不必要的,更不用说它会将代码拉伸到原始长度的 3 倍,从而使阅读变得更糟。此外,例如,在大多数情况下,我不需要向数据成员写入函数。
当我可以只为我需要的情况编写 Q_INVOKABLE getter 时,为什么还要为 Q_PROPERTY 开销而烦恼呢?
这是我在阅读 Qt 项目文档时希望它是多么简单的一个示例:“这使得 C++ 数据和函数可以直接从 QML 访问,通常只需很少或不需要修改。”
class game : public QObject
{
Q_OBJECT
public:
explicit game(QObject *parent = 0);
colors NPC[3]; // colors being an enum declared elsewhere
player players[4]; // player is a non-QObject class containing player stats
}
...
game gMain;
QDeclarativeContext *context = viewer.rootContext();
context->setContextProperty("Game",&gMain);
我理想世界中的 QML:
Image {
id : Image1
source: { if (Game.NPC[0] === 0) {
if (Game.players[1].LifeCount > 0) {
return "pics/FigG.png"
}
else {
return "pics/StoneG.png"
}
}
现在,我实际上可以使用 QML 有多接近这一点,我该如何去做呢?我对处理简单的 C++ 风格的数组和枚举特别感兴趣(游戏中有很多)——我是否需要编写辅助函数,例如,int Game.GetNPCAt(int i)
而不是只使用Game.NPC[i]
?
我意识到我不想这样做的方式是久经考验和值得信赖的,并且有充分的理由......但是在我的情况下(小型单人项目)似乎使用大炮杀死苍蝇(尽管qml 中的 GUI 构建部分非常简单并且使用起来非常愉快) - 还必须围绕每个数据成员,包括最简单的 int 似乎......太荒谬了。
也许我在某个地方遗漏了什么,在这种情况下,我谦虚地道歉。感谢您对此事的任何想法。