6

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

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

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

在阅读了许多教程文档后,我仍然不知道“默认”解决方案是什么。每个教程都展示了不同的东西。我对所有的例子和课程感到不知所措。

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

2 回答 2

6

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

无论如何:

  • 当您需要QWindow能够托管 QtQuick 2 内容的 a 时,您需要 aQQuickView或 a 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.
}

然后你可以将 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
}
于 2013-07-30T20:30:58.643 回答
2

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

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

您还可以从 C++ 编写一些 QQuickItem 来布局其子项(如此处建议:http: //qt-project.org/forums/viewthread/29407/

-

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

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

解释 QWidget::createWindowContainer 的博客文章(仅当您想在 QtWidget 应用程序中嵌入 QtQuick2 时……否则,您可以只使用 QtCreator 的 QtQuick2 应用程序的骨架):

于 2013-08-02T01:12:41.817 回答