2013-07-30 15 views
6

Próbuję napisać grę z Qt 5.1 i Qt Szybki 2 i jest to nowy (szybciej) silnik graficzny. Od lat czytam dokumentację, ale wciąż nie mogę określić, jakie klasy użyć, jeśli chcę przenieść elementy na ekranie, których pozycje są określone przez kod C++.Kiedy używać klas w Qt Quick 2 i jak?

W QGraphics było to łatwe: Tworzę instancję QGraphicsScene, dodając do niej dowolnego dziedzica QGraphicsItem, a następnie tworzę instancję QGraphicsView, która jest widgetem i wyświetla wszystkie elementy i ich zmiany. Łączę QGraphicsItem z sygnałami, aby wprowadzić zmiany.

W QT Szybki 2 raz pierwszy przeczytałem

  • official examples że tylko używany QML i JavaScript
  • potem pomyślałem znalazłem odpowiedniki QGraphics, mianowicie QDeclarativeEngine, QDeclarativeComponent i QDelcarativeView i był gotowy do tworzenia niestandardowych elementów QML z Q_PROPERTY
    • UPDATE: Przed chwilą dowiedziałem się, że QDeclarative * jest Qt Szybki 1 i QQml * jest odpowiednikiem Qt Szybki 2 prefiks.
  • Ale wtedy również QQuickItem, QQuickWindow, QSGNode etc..
Po przeczytaniu wielu dokumentacji samouczków wciąż nie wiem, czym jest "domyślne" rozwiązanie. Każdy samouczek pokazuje coś innego. Jestem przytłoczony wszystkimi przykładami i klasami.

  • Czy ktoś mógłby mi dać podstawowy przykład, który jest oparty na Qt Szybki 2 i gdzie obrazy na płótnie są przemieszczane wokół sygnały, które są wysyłane z regularnych QObjects napisany w C++?
  • Czy możesz mi pomóc kategoryzować wszystkie klasy I wymienione. Którego używam kiedy?

Odpowiedz

6

myślę robisz zamieszanie o rzeczach, na różnych poziomach, a acually czyni to pytanie „związek” pytanie, które należy podzielić na mniejsze pytań ...

Byle:

  • kiedy trzeba QWindow, która jest w stanie pomieścić QtQuick 2 zawartość, to musisz QQuickView lub QQuickWindow (zwykle pierwszego, ma zapewnia większą wygodę; zobaczyć swoje dokumenty).
  • QtQuick2 nie QGraphicsView -na. Nie ma go nawet w QtWidgets - nie można tam użyć żadnej klasy związanej z widżetami ani interfejsu API.
  • Najprostszym sposobem wiązania elementu QML właściwość jednego z C++ obiektu tylko wystawienie tego obiektu z silnikiem QML, a następnie wykonać zwykły wiązania.

Na przykład:

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. 
} 

Następnie można narazić instancji MyObject do silnika QML:

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

podkreślenia jest miłym akcentem podkreślić fakt, że nazwa ta pochodzi ze świata C++.

Wreszcie w QML, można po prostu związana z właściwością:

Rectangle { 
    x: _myObject.horizontalPos // voilà, they're bound together 
} 
+0

Kiedy muszę się QWindow? To część problemu, który mam. Z QGraphics właśnie dodałem QGraphicView gdzieś w moim układzie. – problemofficer

+0

Nie można zrobić tego samego bezpośrednio, ponieważ 'QQuickView' nie jest' QWidget'; możesz ustawić taki widok za pomocą 'QWidget :: createWindowContainer'. – peppe

2

Można dynamicznie instancję zwyczaj QML składniki z C++ boku i modyfikować właściwości, nadal z C++ stronie.

Możesz także po prostu pracować nad listą C++/modelem/wieloma obiektami zawierającymi pozycje twoich duszków/znaków/czymkolwiek, co wyświetlasz na ekranie, a następnie powiązać tę listę ze stroną qml.

Można również napisać QQuickItem od C++, że layouty swoje dzieci (jak zaproponowano tutaj: http://qt-project.org/forums/viewthread/29407/)

-

A oto kilka linków kompletowanie odpowiedź Peppe w/detalami jak mieszać QtQuick2 & C++:

Strony doc dla Qt Szybkie 2/C++ integracji (doc Qt5 nie jest dobrze indeksowane przez Google):

blogu wpis wyjaśniający QWidget :: createWindowContainer (to tylko jeśli chcesz osadzić QtQuick2 w aplikacji QtWidget ... inaczej, można po prostu użyć domyślnych ustawień dla aplikacji QtQuick2 z Qt Creator):