Когда какие классы использовать в Qt Quick 2 и как?

Я пытаюсь написать игру с Qt 5.1 и Qt Quick 2 и новым (более быстрым) графическим движком. Я часами читаю документацию, но до сих пор не могу понять, какие классы использовать, если я хочу перемещать элементы на экране, положение которых определяется кодом C++.

В QGraphics это было легко: я создаю экземпляр QGraphicsScene, добавляю к нему любого наследника QGraphicsItem, а затем создаю экземпляр QGraphicsView, который является виджетом и отображает все элементы и их изменения. Я подключаю QGraphicsItem к сигналам для внесения изменений.

In Qt Quick 2 I first read the

  • официальные примеры, в которых использовались только QML и Javascript,
  • then I thought I found the equivalents to QGraphics, namely QDeclarativeEngine, QDeclarativeComponent and QDelcarativeView and was ready to create custom QML elements with Q_PROPERTY
    • UPDATE: Just now I found out that QDeclarative* is Qt Quick 1 and QQml* is the equivalent Qt Quick 2 prefix.
  • Но затем я также нашел QQuickItem, QQuickWindow, QSGNode и т. д..
After reading many tutorials documentations I still don't know what the "default" solution is. Every tutorial shows something different. I am overwhelmed with all the examples and classes.

  • Может ли кто-нибудь дать мне базовый пример, основанный на Qt Quick 2, где изображения на холсте перемещаются с помощью сигналов, которые отправляются из обычных объектов QObject, написанных на C++?
  • Не могли бы вы помочь мне классифицировать все классы, которые я упомянул. Что я использую, когда?

person problemofficer    schedule 30.07.2013    source источник


Ответы (2)


Я думаю, вы путаете вещи на разных уровнях, и это фактически делает этот вопрос «составным» вопросом, который следует разделить на более мелкие вопросы ...

Во всяком случае:

  • когда вам нужен 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.
}

Затем вы можете предоставить экземпляр 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
}
person peppe    schedule 30.07.2013
comment
Когда мне нужен QWindow? Это часть моей проблемы. С QGraphics я просто добавил QGraphicView где-то в своем макете. - person problemofficer; 31.07.2013
comment
Вы не можете сделать то же самое напрямую, поскольку QQuickView не является QWidget; вы можете разместить такое представление, используя QWidget::createWindowContainer. - person peppe; 31.07.2013

Вы можете динамически создавать пользовательские компоненты qml со стороны С++ и изменять свойства по-прежнему со стороны С++.

Вы также можете просто работать с некоторым списком/моделью/несколькими объектами C++, содержащими позиции ваших спрайтов/символов/все, что вы отображаете на экране, а затем связать этот список со своей стороной qml.

Вы также можете написать некоторый QQuickItem из C++, который размещает своих дочерних элементов (как предложено здесь: http://qt-project.org/forums/viewthread/29407/)

-

И вот несколько ссылок, завершающих ответ Пеппе / подробно описывающих, как смешивать QtQuick2 и C++:

Страницы документации для интеграции Qt Quick 2/С++ (документ Qt5 плохо индексируется Google):

Сообщение в блоге, объясняющее QWidget::createWindowContainer (это только в том случае, если вы хотите встроить QtQuick2 в приложение QtWidget... в противном случае вы можете просто использовать скелет для приложения QtQuick2 из QtCreator):

person QuidNovi    schedule 02.08.2013