2013-07-30 41 views
6

Tôi đang cố gắng viết một trò chơi với Qt 5.1 và Qt Quick 2 và đó là công cụ đồ họa mới (nhanh hơn). Tôi đã đọc tài liệu trong nhiều giờ nhưng vẫn không thể tìm ra các lớp nào sẽ sử dụng nếu tôi muốn di chuyển các mục trên màn hình có vị trí được xác định bằng mã C++. Trong QGraphics nó rất dễ: Tôi tạo một thể hiện của QGraphicsScene thêm bất kỳ người thừa kế nào của QGraphicsItem vào nó và sau đó tạo một thể hiện của QGraphicsView là một Widget và hiển thị tất cả các mục và các thay đổi của chúng. Tôi kết nối QGraphicsItem với các tín hiệu để thực hiện thay đổi.Khi nào nên sử dụng các lớp nào trong Qt Quick 2 và cách sử dụng?

Trong Qt nhanh 2 đầu tiên tôi đọc

  • official examples mà chỉ được sử dụng QML và Javascript,
  • sau đó tôi nghĩ rằng tôi tìm thấy tương đương để QGraphics, cụ thể là QDeclarativeEngine, QDeclarativeComponent và QDelcarativeView và đã sẵn sàng để tạo ra các yếu tố tùy chỉnh QML với Q_PROPERTY
    • CẬP NHẬT: Bây giờ tôi phát hiện ra rằng QDeclarative * là Qt Quick 1 và QQml * là tiền tố Qt Quick 2 tương đương.
  • Nhưng sau đó tôi cũng tìm thấy QQuickItem, QQuickWindow, QSGNode etc..
Sau khi đọc nhiều tài liệu hướng dẫn, tôi vẫn không biết giải pháp "mặc định" là gì. Mọi hướng dẫn đều cho thấy điều gì đó khác biệt. Tôi bị choáng ngợp với tất cả các ví dụ và các lớp học.

  • Ai đó có thể cho tôi một ví dụ cơ bản dựa trên Qt Quick 2 và nơi hình ảnh trên canvas được di chuyển xung quanh bằng các tín hiệu được gửi từ QObject thường được viết bằng C++?
  • Bạn có thể giúp tôi phân loại tất cả các lớp tôi đã đề cập hay không. Tôi nên sử dụng khi nào?

Trả lời

6

Tôi nghĩ rằng bạn đang làm cho sự nhầm lẫn về những điều trên cấp độ khác nhau, và điều đó làm cho acually câu hỏi này một "hợp chất" Câu hỏi đó nên được chia trong các câu hỏi nhỏ ...

Nhưng dù sao:

  • khi bạn cần QWindow có thể lưu trữ nội dung QtQuick 2, sau đó bạn cần QQuickView hoặc QQuickWindow (thường là trước đây, mang đến nhiều tiện lợi hơn; xem tài liệu của họ).
  • QtQuick2 không phải là QGraphicsView dựa trên. Nó thậm chí không có trong QtWidgets - bạn không thể sử dụng bất kỳ lớp hoặc API liên quan đến widget nào ở đó.
  • Cách dễ nhất để liên kết thuộc tính phần tử QML với đối tượng C++ là chỉ hiển thị đối tượng đó với công cụ QML, sau đó thực hiện một ràng buộc thông thường.

Ví dụ:

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

Sau đó, bạn có thể phơi bày một thể hiện của MyObject để động cơ QML:

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

Các dấu gạch dưới là một liên lạc tốt đẹp để nhấn mạnh một thực tế rằng tên này xuất phát từ thế giới C++.

Cuối cùng, trong QML, bạn có thể chỉ bị ràng buộc vào bất động sản:

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

Khi nào tôi cần một QWindow? Đây là một phần của vấn đề tôi đang gặp phải. Với QGraphics tôi vừa thêm QGraphicView vào đâu đó trong layout của mình. – problemofficer

+0

Bạn không thể thực hiện tương tự trực tiếp, vì 'QQuickView' không phải là' QWidget'; bạn có thể lưu trữ một khung nhìn như vậy bằng cách sử dụng 'QWidget :: createWindowContainer'. – peppe

2

Bạn năng động có thể nhanh chóng các thành phần tùy chỉnh QML từ C++ bên và sửa đổi các thuộc tính, vẫn từ phía bên C++.

Bạn cũng có thể làm việc trên một số danh sách C/mô hình/nhiều qobject có chứa vị trí của sprites/characters/bất cứ điều gì bạn hiển thị trên màn hình, và sau đó ràng buộc danh sách này với bên qml của bạn.

Bạn cũng có thể viết một số QQuickItem từ C++ mà bố trí con của nó (như đề xuất ở đây: http://qt-project.org/forums/viewthread/29407/)

-

Và đây là một số liên kết hoàn thành câu trả lời Peppe của/chi tiết làm thế nào để trộn QtQuick2 & C++:

các trang doc cho Qt nhanh 2/C++ tích hợp (doc Qt5 cũng không phải là lập chỉ mục bởi Google):

Các bài viết trên blog giải thích QWidget :: createWindowContainer (nó chỉ nếu bạn muốn nhúng QtQuick2 trong một ứng dụng QtWidget ... nếu không, bạn chỉ có thể sử dụng các bộ xương cho một ứng dụng QtQuick2 từ QtCreator):