我正在用qml在Qt/C++中做一个棋盘游戏。所有重要的游戏数据都表示在一个类中。我的意图是让qml工作表访问这个对象,并根据数据绘制游戏板。
向QML公开C++数据成员的最简单方法是什么?
现在我知道问题已经被问到了,我已经看到了答案和Qt文档。不过,我并不满意。我看到的是,这样做的方法似乎是将Q_PROPERTY从我想从QML访问的每个变量中提取出来。在我看来,这既乏味又没有必要,更别提它会把代码扩展到原来长度的3倍,这使得阅读起来要糟糕得多。另外,在大多数情况下,我不需要向数据成员写入函数,例如。
如果我只需要为所需的情况编写Q_PROPERTY getter,那么为什么还要考虑Q_INVOKABLE开销呢?
下面是我在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构建部分是惊人的简单和相当joy使用)-也必须围绕每一个数据成员,包括最简单的一个int似乎.过分得离谱。
也许我错过了什么地方,在这种情况下,我谦逊地道歉。谢谢你对这件事的任何想法。
发布于 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函数来实现您引用的内容:
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。
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与普通数组非常相似。我找到了这,它应该会有帮助--忽略第二个维度。
希望这能有所帮助。
https://stackoverflow.com/questions/16071256
复制相似问题