2013-07-30 17 views
6

我想用Qt 5.1和Qt Quick 2编写游戏,它是新的(更快)图形引擎。我一直在阅读文档数小时,但仍然无法弄清楚如果我想移动屏幕上的位置由C++代码确定的项目,可以使用哪些类。何时使用Qt Quick 2中的哪些类以及如何使用?

在QGraphics中很简单:我创建一个QGraphicsScene的实例,添加QGraphicsItem的任何继承者,然后创建一个作为Widget的QGraphicsView实例并显示所有项目及其更改。我将QGraphicsItem连接到信号进行更改。

在Qt Quick的2我第一次读

  • official examples,只有使用QML和Javascript,
  • 然后我想我找到了等同QGraphics,即QDeclarativeEngine,QDeclarativeComponent和QDelcarativeView并准备创建定制QML元素与Q_PROPERTY
    • UPDATE:刚才我发现QDeclarative *是Qt Quick 1,QQml *是等效的Qt Quick 2前缀。
  • 但后来我也发现QQuickItem, QQuickWindow, QSGNode etc.
阅读了很多教程文档后,我仍然不知道“默认”解决方案是什么。每个教程都展示了不同的东西我对所有的例子和课程感到不知所措。

  • 有人可以给我一个基于Qt Quick 2的基本示例,以及从用C++编写的常规QObject发送的信号移动画布上的图像吗?
  • 你能帮我分类我提到的所有课程吗?我该在什么时候使用?

回答

6

我认为你正在做关于不同层次的东西迷惑,而acually使得这个问题“复合”的问题应在更小的问题,拆分...

总之:

  • 当你需要一个QWindow这是能够承载QtQuick 2含量,那么你需要一个QQuickViewQQuickWindow(通常是前者,有提供更多的便利;看到自己的文档)。
  • QtQuick2不是QGraphicsView-based。它甚至不在QtWidgets中 - 你不能在那里使用任何窗口小部件相关的类或API。
  • 将QML元素属性绑定到C++对象的最简单方法是将该对象暴露给QML引擎,然后执行普通绑定。

例如:

class MyObject : public QObject { 
    Q_OBJECT 
    Q_PROPERTY(int horizontalPos READ horizontalPos NOTIFY horizontalPosChanged) 
public: 
    int horizontalPos() const { return m_horizontalPos; } 
signals: 
    void horizontalPosChanged(); 
    // etc. 
} 

然后你就可以公开的MyObject的实例为QML引擎:

MyObject obj; 
QQuickView view; 
// exposes the object under the "_myObject" name 
view.engine()->context()->setContextProperty("_myObject", &obj); 

下划线是一个很好的接触强调的是,这个名字来源于一个事实来自C++世界。

最后,在QML,你可以绑定到的属性:

Rectangle { 
    x: _myObject.horizontalPos // voilà, they're bound together 
} 
+0

什么时候我需要一个QWindow?这是我遇到的问题的一部分。使用QGraphics,我只是在我的布局中添加了QGraphicView。 – problemofficer

+0

你不能直接做同样的事情,因为'QQuickView'不是'QWidget';你可以使用'QWidget :: createWindowContainer'来托管这样的视图。 – peppe

2

您可以动态地实例从C++端定制QML组件和从C++侧修改属性,依然。

你也可以在一些包含你的精灵/角色/你在屏幕上显示的位置的C++ list/model/multiple qobjects上工作,然后将这个列表绑定到你的qml端。

你也可以写在C++中布局其子(如这里提出:http://qt-project.org/forums/viewthread/29407/)一些QQuickItem

-

这里有一些链接完成佩普的回答/详细介绍了如何QtQuick2 &℃下混合++:

的文档页面的Qt Quick的2/C++集成(该QT5 DOC不能很好地通过谷歌索引):

的博客文章,解释了QWidget :: createWindowContainer(如果要嵌入QtQuick2在QtWidget应用它只有...否则,你可以使用骨架从QtCreator一个QtQuick2应用):

相关问题