gpt4 book ai didi

c++ - 从 QML 简单访问 C++ 对象数据

转载 作者:太空宇宙 更新时间:2023-11-04 14:08:12 26 4
gpt4 key购买 nike

我正在使用 qml 在 Qt/C++ 中制作棋盘游戏。所有重要的游戏数据都在一个类中表示。我的意图是让 qml 工作表访问这个对象并根据数据绘制游戏板。

将 C++ 数据成员暴露给 QML 的最简单方法是什么?

现在我知道问题已被提出,我已经看到了答案和 Qt 文档。然而,我并不满意。我所看到的,执行此操作的方法似乎是从我想从 QML 访问的每个变量中生成 Q_PROPERTY。这在我看来既乏味又不必要,更不用说它会将代码拉伸(stretch)到原始长度的 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 这样的最简单的数据成员,这似乎......太过分了。

也许我遗漏了什么地方,在这种情况下,我谦虚地道歉。感谢您对此事的任何想法。

最佳答案

按顺序:

Q_PROPERTY:当您查看 page that you quoted ,他们讨论了使用 Q_PROPERTY 方法将属性公开给 QML。如果您不使用 Q_PROPERTY,我的理解是您的变量不会被 QMLViewer(或您拥有的)注册。 Q_PROPERTY 需要一个 Q_INVOKABLE 来获取/设置您的变量。但是,如果您不使用 Q_PROPERTY,您的类属性将不会出现在 QML 中。

设置图像源:如果您还记得,QML 是 CSS 和 JavaScript 的结合体。如果您只是想根据 Image 元素之外的条件更改图像的来源,您可以创建一个 JavaScript 函数来实现您引用的内容:

Image {
id: Image1

function getImage()
{
if (Game.NPC[0] === 0)
{

if (Game.players[1].LifeCount > 0) {
Image1.source="pics/FigG.png";
}
else {
Image1.source="pics/StoneG.png";
}
}
}

但是,该函数不会自行运行:您必须将它与我将在您的 C++ 类中创建的信号相关联(将函数放在名为 signals: 的标签下(不在 public 中——参见 here 如何编写信号)。根据您的示例,我猜测您的 C++ 对象名为 Game

Game {
id: gameKeeper //or whatever you want to name it
onUpdate: Image1.getImage() //replace onUpdate with your signal
}

Image {
id: Image1

function getImage()
{
if (gameKeeper.NPC[0] === 0)
{

if (gameKeeper.players[1].LifeCount > 0) {
Image1.source="pics/FigG.png";
}
else {
Image1.source="pics/StoneG.png";
}
}
}

理论上,您应该能够使用 JavaScript 以这种方式引用数组(我自己对 JS 不是很熟悉)。

数组处理:在 C++ 方面,看起来最好的方法是通过 QList。幸运的是,QList 的迭代与普通数组非常相似。我找到了 this ,这应该有所帮助 - 只需忽略第二个维度。

希望这对您有所帮助。

关于c++ - 从 QML 简单访问 C++ 对象数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16071256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com