2014-10-16 17 views
14

Tôi gặp sự cố sau.Cách hiển thị cấu trúc C++ để tính toán cho Qml

Tôi đang phát triển một mô hình trong C++ và Chế độ xem trong Qml, kết nối chúng thông qua Bộ điều khiển. Trong mô hình của tôi, tôi thực hiện nhiều phép tính. Tôi cũng cung cấp cho người dùng ứng dụng của tôi khả năng, để viết trình xử lý sự kiện tùy chỉnh, được viết bằng qml. Bây giờ tôi đã đi qua một điểm, nơi tôi quyết định sử dụng ký hiệu điểm cố định và tôi đã viết một lớp C++ tương ứng. Bây giờ tôi muốn cung cấp lớp FixedPoint - bao gồm tất cả các toán tử của nó - cho các nhà phát triển, người quyết định mở rộng ứng dụng của tôi trong Qml. Cho đến nay, tôi cung cấp tất cả các dữ liệu như QProperties, được yêu cầu bởi các hướng dẫn mã hóa. Nhưng tôi mở cho các giải pháp khác để thảo luận chúng trong nhóm của tôi. Rõ ràng, một điểm cố định không có nhận dạng và thuật toán dựa vào khả năng sao chép nó, không được phép khi kế thừa từ QObject.

Vì vậy, câu hỏi đặt ra: Làm thế nào tôi có thể trưng ra lớp/cấu trúc C++ cho QML, KHÔNG phải là danh tính?

Một ví dụ trong mã:

struct FixedPoint 
{ 
    FixedPoint(FixedPoint&); 
    FixedPoint& operator=(FixedPoint&); 
    ... 
    int mantissa; 
    int exponent; 
} 

Tôi muốn sử dụng nó trong QML như một tài sản (giá trị) của một QQuickItem viết bằng C++:

MyQmlObject{ 
    value{ mantissa: 134; exponent: 3 } 
} 

Thuộc tính giá trị là sau đó được sử dụng trong suốt tính toán trong javascript và được sao chép nhiều lần trong một chặng đường dài. Vì vậy, tôi không thể làm cho giá trị một tài sản của loại FixedPoint * Tôi nghĩ. Tôi có đúng không?

+1

Bạn đã cố sử dụng 'Q_DECLARE_METATYPE' +' qmlRegisterMetatype'? Lưu ý rằng trong trường hợp này, bạn chỉ có thể truyền giá trị thông qua tín hiệu/khe. Bởi vì, để trực tiếp truyền một cái gì đó đến/từ QML, nó phải là một 'QObject'. Các toán tử sẽ không hoạt động bên trong QML, vì bạn không thể mở rộng ngôn ngữ QML :) –

+1

Bạn có thể bọc thể hiện của bạn thành QVariant nếu bạn chỉ cần truyền nó đi (ví dụ bạn không cần sử dụng nó trong các biểu thức javascript). – sergk

+1

Mặt khác, nếu bạn cần sử dụng nó trong qml, bạn nên lấy từ QObject hoặc sử dụng QMap . – sergk

Trả lời

4

Cảm ơn sự giúp đỡ của bạn. Tuy nhiên, chúng tôi đã quyết định sử dụng QObject, nhưng theo kiểu Wrapper. Tức là, chúng tôi vừa xây dựng một FixPointWrapper (kế thừa QObject), giữ một FixedPointValue thực tế. Điều đó có thể được sử dụng để tính toán sau đó. Âm thanh phức tạp, nhưng hoạt động tốt. Đặc biệt quan trọng đối với việc chúng ta có khả năng là sao chép và gán các giá trị FixedPoint. Vì vậy, wrapper là cần thiết.

//QML 
MyQmlObject{ 
    value {mantissa: 2; exponent: 4} 
} 


//C++ 
class MyQmlObject : public QQuickItem 
{ 
    Q_Property(FixedPointWrapper* value ...) 
} 

class FixedPointWrapper : public QObject 
{ 
    ... 
    public slots: 
     void setValue(FixedPoint){ //Forward to FixedPoint and implement your wanted effect. The same for getter} 
    private: 
    FixedPoint value;  
} 

Ban đầu nó cảm thấy như một vụ bẩn, nhưng sau khi chúng tôi dành thêm một vài suy nghĩ, chúng tôi có thể sống với kết quả.

Vì vậy, một lần nữa, cảm ơn sự giúp đỡ của bạn.

Các vấn đề liên quan