2010-03-23 32 views

Trả lời

0

Bạn có thể lưu trữ các trường hợp metaclass bạn sẽ cần trong một Hash hoặc Bản đồ, và sau đó lấy chúng thông qua bất cứ tên nào bạn lưu trữ chúng dưới

0

Đối với trường hợp của bạn là giải pháp thích hợp có thể được sử dụng cơ chế Plugin Qt. Nó cung cấp chức năng để dễ dàng tải thư viện chia sẻ/động và kiểm tra xem nó có chứa thực hiện một số giao diện mong muốn hay không, nếu vậy - tạo cá thể. Chi tiết có thể tìm thấy tại đây: How to Create Qt Plugins

1

Bạn có thể thực hiện việc này với QMetaType. Bạn có thể cần Q_DECLARE_META_TYPE() và/hoặc qRegisterMetaType() để làm cho các loại của bạn được biết. Sau đó, nó sẽ hoạt động gần giống như trong ví dụ này từ liên kết:

int id = QMetaType::type("MyClass"); 
if (id == 0) { 
    void *myClassPtr = QMetaType::construct(id); 
    ... 
    QMetaType::destroy(id, myClassPtr); 
    myClassPtr = 0; 
} 
1

Tôi đã đối mặt với cùng một vấn đề gần đây. Tôi cần metaobject mà không cần phải tạo một thể hiện của chính lớp đó. Tốt nhất tôi có thể làm là tạo ra một hàm toàn cục/tĩnh để lấy qmetaobject cho tên lớp. Tôi đã đạt được điều này bằng cách sử dụng QObject :: staticMetaObject.

QMetaObject GetMetaObjectByClassName(QString strClassName) 
{ 
    QMetaObject metaObj; 
    if (strClassName.compare("MyClass1") == 0) 
    { 
     metaObj = MyClass1::staticMetaObject; 
    } 
    else if (strClassName.compare("MyClass2") == 0) 
    { 
     metaObj = MyClass2::staticMetaObject; 
    } 
    else if (strClassName.compare("MyClass3") == 0) 
    { 
     metaObj = MyClass3::staticMetaObject; 
    } 
    else if (strClassName.compare("MyClass4") == 0) 
    { 
     metaObj = MyClass4::staticMetaObject; 
    } 
    else if (strClassName.compare("MyClass5") == 0) 
    { 
     metaObj = MyClass5::staticMetaObject; 
    } 

    // and so on, you get the idea ... 

    return metaObj; 
} 

Xem: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var

Nếu ai đó có một lựa chọn tốt hơn, xin vui lòng chia sẻ!

-1

Bạn cũng có thể xem xét các chức năng: QMetaType::metaObjectForType

lợi nhuận QMetaType :: metaObject cho loại

Cập nhật: Đó là mã của tôi, nó tạo ra một lớp theo tên lớp . (Lưu ý rằng các lớp phải được đăng ký với qRegisterMetaType (hoặc là cơ sở QObject)

int typeId = QMetaType::type("MyClassName"); 
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId); 
QObject *o = metaObject->newInstance(); 
MyClassName *myObj = qobject_cast<MyClassName*>(o); 

Cập nhật 2:. Tôi đã quên nói constructor yout lớp phải được đánh dấu là Q_INVOKABLE

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