2013-09-28 139 views
11

Tôi đang cố gắng sử dụng các lớp tùy chỉnh trong QAbstractListModel và Q_DECLARE_METATYPE không hoạt động chút nào!Q_DECLARE_METATYPE không hoạt động ở tất cả

Để kiểm tra nơi mà vấn đề là, tôi đã đơn giản hóa các mã như sau:

#include <QMetaType> 
#include <QVariant> 
#include <QDebug> 

typedef int x; 
Q_DECLARE_METATYPE(x) 

void main() { 
    QVariant v; 
    qDebug() << v.canConvert<x>(); 
} 

và đầu ra vẫn còn sai!

btw, đoạn code tôi muốn thực hiện là như:

namespace ns{ 
    class a { 
     public: 
      a(); //default constructor 
      a(const a&); //copy constructor 
      ~a(); 
    } 
} 
Q_DECALRE_METATYPE(ns::a); 

và khi tôi cố gắng reimplement QAbstractListModel :: dữ liệu như thế này:

QList<ns::s> list; //this is actually a member field of the custom model. 
QVariant MyListModel::data(const QModelIndex& index, int role) const {  
    Q_UNUSED(role) 
    return list.at(index.row());   
} 

trình biên dịch sẽ báo cáo và báo lỗi như sau:

cannot convert const ns::a to QVariant::Type 

Trả lời

19

Ví dụ của bạn quá đơn giản vì tài liệu nêu rõ ràng rằng lớp/struct bei ng truyền cho Q_DECLARE_METATYPE phải có một constructor mặc định, một constructor sao chép và một destructor công cộng: http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#Q_DECLARE_METATYPE

đó đang được nói, đây là một ví dụ khá đơn giản cho thấy Q_DECLARE_METATYPE làm việc:

#include <QMetaType> 
#include <QVariant> 
#include <QDebug> 

namespace MyNS { 
    class MyClass { 
    public: 
     MyClass() : value(0) { } 
     MyClass(int value) : value(value) { } 
     MyClass(const MyClass &other) { value = other.value; } 
     ~MyClass() { } 
     int getValue() const { return value; } 
    private: 
     int value; 
    }; 
}; 

Q_DECLARE_METATYPE(MyNS::MyClass); 

int main(int argc, char *argv[]) 
{ 
    MyNS::MyClass m(15); 
    QVariant v = QVariant::fromValue(m); 
    qDebug() << v.canConvert<MyNS::MyClass>(); 
    qDebug() << v.value<MyNS::MyClass>().getValue(); 
} 
+1

vâng, tôi đột nhiên nhận ra nơi vấn đề là. vấn đề là khi thực hiện 'MyModel :: data (const QModelIndex & index, int role) const', tôi nên sử dụng' return QVariant :: fromValue (MyClass) 'thay vì' return Myclass'. – user2826776

+0

Đọc [doc loại tài liệu tùy chỉnh Qt] (http://doc.qt.io/qt-5/custom-types.html), tôi không chắc chắn cách sử dụng macro. Khi 'Q_DECLARE_METATYPE (MyClass);' nằm trong phạm vi của chính lớp đó, quá trình biên dịch không thành công với lỗi 'chuyên môn hóa rõ ràng trong phạm vi không gian tên 'lớp MyClass''. Ví dụ hiển thị vị trí chính xác để chèn macro. Cảm ơn! – fgiraldeau