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

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

现在我知道问题已经提出,我已经看到了答案和Qt文档。 但是,我不满意。 我所看到的,执行此操作的方法似乎是从我想从QML访问的每个变量中提取Q_PROPERTY。 在我看来,这很乏味且不必要,更不用说它将代码扩展到原始长度的3倍,从而使阅读变得更加糟糕。 同样,在大多数情况下,例如,我不需要向数据成员写入功能。

当我只为我需要的情况编写Q_INVOKABLE getter时,为什么还要麻烦Q_PROPERTY呢?

这是当我阅读Qt Project文档时希望它多么简单的示例: “这使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),这似乎太荒谬了。

也许我在某处错过了某些东西,在这种情况下,我很抱歉。 谢谢您对此事的任何想法。

===============>>#1 票数:0

为了:

Q_PROPERTY :当您查看引用页面时 ,他们讨论使用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:的标签下signals:不在public -参见此处的方法写信号))。 根据您的示例,我猜您的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的迭代非常类似于普通数组。 我发现 ,这应该有所帮助-只需忽略第二个维度。

希望这可以帮助。

  ask by user742925 translate from so

未解决问题?本站智能推荐: