首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QML中C++对象数据的简单访问

QML中C++对象数据的简单访问
EN

Stack Overflow用户
提问于 2013-04-17 22:22:17
回答 1查看 1.1K关注 0票数 1

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

向QML公开C++数据成员的最简单方法是什么?

现在我知道问题已经被问到了,我已经看到了答案和Qt文档。不过,我并不满意。我看到的是,这样做的方法似乎是将Q_PROPERTY从我想从QML访问的每个变量中提取出来。在我看来,这既乏味又没有必要,更别提它会把代码扩展到原来长度的3倍,这使得阅读起来要糟糕得多。另外,在大多数情况下,我不需要向数据成员写入函数,例如。

如果我只需要为所需的情况编写Q_PROPERTY getter,那么为什么还要考虑Q_INVOKABLE开销呢?

下面是我在Qt文档中阅读时希望它是多么简单的一个例子:“这使得C++数据和函数可以直接从QML访问,通常只需很少或根本不做任何修改。”

代码语言:javascript
运行
复制
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在我的理想世界:

代码语言:javascript
运行
复制
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构建部分是惊人的简单和相当joy使用)-也必须围绕每一个数据成员,包括最简单的一个int似乎.过分得离谱。

也许我错过了什么地方,在这种情况下,我谦逊地道歉。谢谢你对这件事的任何想法。

EN

回答 1

Stack Overflow用户

发布于 2013-05-22 02:21:42

按顺序:

Q_PROPERTY:当您查看你引用的那页时,他们讨论使用Q_PROPERTY方法向QML公开属性。如果您不使用Q_PROPERTY,我的理解是您的变量不会被QMLViewer注册(或者其他什么)。Q_PROPERTY需要一个Q_INVOKABLE来获取/设置变量。但是,如果不使用Q_PROPERTY,类属性将不会出现在QML中。

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

代码语言: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中--关于如何写入信号,请参见这里 ))。根据您的示例,我猜想您的C++对象名为Game

代码语言:javascript
运行
复制
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与普通数组非常相似。我找到了,它应该会有帮助--忽略第二个维度。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16071256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档