2014-07-13 13 views
5


Tôi đang viết một ứng dụng Qt.
Tôi đã tách ứng dụng của mình thành giao diện người dùng QML và chương trình phụ trợ C++ plugin.
Trong plugin C++ của tôi, tôi có một lớp trừu tượng Phiên mà tôi muốn hiển thị cho QML và tôi cũng có một vài triển khai của lớp đó.
Tôi muốn giao diện QML của mình chỉ biết về lớp Phiên và không bị làm phiền với các chi tiết cụ thể về loại phiên đó.
Tôi đã thử một vài biến thể của qmlRegister * để đăng ký loại Session với QML nhưng Session cần phải cụ thể (như trong trường hợp qmlRegisterType) hoặc nó đăng ký tốt nhưng tôi không thể tham khảo loại Session từ QML như trong property Session session mà không cần khởi tạo một phiên từ QML.
Có ai biết cách tiếp cận điều này không?Đăng ký lớp trừu tượng C++ trong plugin QML và tham khảo nó từ QML

CẬP NHẬT:
Một ví dụ về những gì đã không làm việc:
Trong main.cpp:

char const* const uri = "com.nogzatalz.Downow"; 
qmlRegisterUncreatableType<downow::Session>(uri, 1, 0, "Session", "Abstract type"); 

Trong DowNow.qml:

import QtQuick 2.0 
import com.nogzatalz.Downow 1.0 

Item { 
    property Session session 
} 
+0

Bạn nên thêm chính xác những gì bạn đã thử và những gì đã sai. Ngoài ra, bạn có ý nghĩa gì với "một vài triển khai của lớp đó" – labsin

+0

Tôi đã cố gắng đăng ký lớp tóm tắt phiên bằng cách sử dụng qmlRegisterType/qmlRegisterInterface/qmlRegisterUncreatableType. Sau đó, tôi đã cố gắng giữ một đối tượng Session như một tài sản trong QML nhưng nó không hoạt động. Bởi "một vài triển khai của lớp đó" tôi có nghĩa là lớp tóm tắt phiên có một vài lớp cụ thể kế thừa từ nó. –

+0

Bạn có tìm thấy giải pháp nào cho prolem không? Tôi đang xử lý vấn đề tương tự. – likeToCode

Trả lời

1

Theo tôi biết đó là không thể tạo biến bằng cách sử dụng lớp trừu tượng làm định nghĩa.

Bạn có thể khai báo biến phiên làm QtObject trong mã qml, bạn sẽ chỉ mất tính năng tự động hoàn thành của qtcreator.
Tuy nhiên, tất cả các thuộc tính khai báo với macro Q_PROPERTY và tất cả các hàm Q_INVOKABLE sẽ vẫn có sẵn khi chạy.

Nếu bạn muốn có gần như cùng một ngữ nghĩa, tôi khuyên bạn nên tạo một lớp đơn C++ mà bạn đăng ký vào QML bằng cách sử dụng qmlRegisterSingletonType và có lớp đó mang biến "phiên" của bạn. Sau đó, giữ qmlRegisterUncreatableType trên lớp trừu tượng phiên của bạn, như vậy trong mã QML bạn sẽ có thể viết một cái gì đó như:

MySingleton.session 

Và giữ tự động hoàn thành cho QML trong QtCreator.
Là phần thưởng, bạn cũng sẽ có thể tạo tín hiệu "SessionChanged" nếu người dùng của bạn có thể đăng nhập/đăng xuất nhiều lần mà không cần khởi động lại ứng dụng.

0

Tôi đã làm việc này với qmlRegisterInterface. cuộc gọi ảo của tôi là InputDeviceConfigurator:

class InputDeviceConfigurator : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit InputDeviceConfigurator(QObject *parent = 0); 
    Q_INVOKABLE virtual QString deviceId() = 0; 
} 

tôi đăng ký nó như sau:

qmlRegisterInterface<InputDeviceConfigurator>("InputDeviceConfigurator"); 

Và sau đó sử dụng một lớp JoystickConfigurator thừa hưởng:

class JoystickConfigurator : public InputDeviceConfigurator 
{ 
public: 
    JoystickConfigurator(JoystickDevice * device); 

    // InputDeviceConfigurator interface 
    virtual QString deviceId() override; 
} 

Và hơn tôi có thể sử dụng nó:

Component.onCompleted: console.log(UserInputManagement.getConfigurator().deviceId()) 

UserInputManagement chỉ là một Singleton với:

Q_INVOKABLE InputDeviceConfigurator * getConfigurator();