何时使用Qt Quick 2中的哪些类以及如何使用?

时间:2013-07-30 00:50:13

标签: qml qt5 qtquick2

我正在尝试用Qt 5.1和Qt Quick 2编写游戏,它是新的(更快)图形引擎。我已经阅读了几个小时的文档,但是如果我想在屏幕上移动其位置由C ++代码确定的项目,我仍然无法弄清楚要使用哪些类。

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

在Qt Quick 2中,我首先阅读了

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

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

2 个答案:

答案 0 :(得分:6)

我认为你对不同层面的事情感到困惑,这使得这个问题成为一个“复合”的问题,应该在较小的问题上分开......

无论如何:

  • 当您需要能够托管QtQuick 2内容的QWindow 时,您需要QQuickViewQQuickWindow(通常是前者,有提供更多便利;请参阅他们的文档。
  • QtQuick2不是QGraphicsView - 基于。它甚至不在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
}

答案 1 :(得分:2)

您可以从c ++端动态实例化自定义qml组件,并从C ++端修改属性。

您还可以处理一些C ++列表/模型/多个qobjects,其中包含您的精灵/字符的位置/您在屏幕上显示的内容,然后将此列表与您的qml端绑定。

你也可以用C ++写一些QQuickItem来布局它的孩子(就像这里提出的那样:http://qt-project.org/forums/viewthread/29407/

-

这里有一些链接完成了peppe的回答/详细说明如何混合QtQuick2& C ++:

Qt Quick 2 / C ++集成的文档页面(Qt5文档没有很好地被Google编入索引):

解释QWidget :: createWindowContainer的博客文章(仅当你想在QtWidget应用程序中嵌入QtQuick2时才会这样做...否则,你可以使用QtCreator的QtQuick2应用程序的骨架):