Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: problemofficerОтветов: 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++?
  • Не могли бы вы помочь мне классифицировать все классы, которые я упомянул. Что я использую, когда?

qmlqtquick2qt5

Ответы

Ответ 1 · рейтинг 6 · peppe

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

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

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

Ответ 2 · рейтинг 2 · QuidNovi

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

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

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

-

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

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

  • http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-topic.html
  • http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-interactqmlfromcpp.html

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

  • http://blog.qt.digia.com/blog/2013/02/19/introduction-qwidgetcreatewindowcontainer/?utm_source=rss&utm_medium=rss&utm_campaign=introduction-qwidgetcreatewindowcontainer

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы