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