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

pro*_*cer 6 qml qt5 qtquick2

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

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

在Qt Quick 2中我首先阅读了

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

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

pep*_*ppe 6

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

无论如何:

  • 当你需要一个QWindow能够托管QtQuick 2内容的东西时,你需要一个QQuickView或一个QQuickWindow(通常是前者,提供更多便利;请参阅他们的文档).
  • 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.
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将MyObject的实例公开给QML引擎:

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

下划线是一个很好的触摸,强调这个名称来自C++世界的事实.

最后,在QML中,您可以绑定到该属性:

Rectangle {
    x: _myObject.horizontalPos // voilà, they're bound together
}
Run Code Online (Sandbox Code Playgroud)