2013-09-28 8 views
11

QAbstractListModelでカスタムクラスを使用しようとしています.Q_DECLARE_METATYPEがまったく機能しません。Q_DECLARE_METATYPEがまったく機能しない

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

typedef int x; 
Q_DECLARE_METATYPE(x) 

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

を、出力はまだ偽です:

は問題がどこにあるかテストするために、私は次のようなコードを簡素化しました!

ところで、私が実装するコードは次のようである:

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

と私はこのようなQAbstractListModel ::データを再実装しようとすると:

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());   
} 

コンパイラが報告され、エラーのように:

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

答えて

19

この例では、クラス/構造体bei私は突然どこ実現、

#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

うん:http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#Q_DECLARE_METATYPE言われていること

が、ここでQ_DECLARE_METATYPEの作業を示してかなり簡単な例です:NGは、デフォルトコンストラクタ、コピーコンストラクタや公共デストラクタを持っている必要がありますQ_DECLARE_METATYPEに渡されます問題はです。問題は 'MyModel :: data(const QModelIndex&index、int role)const'を実装するときに、' return Myclass'ではなく 'return QVariant :: fromValue(MyClass)'を使うべきだったということです。 – user2826776

+0

[Qtカスタムタイプのドキュメント](http://doc.qt.io/qt-5/custom-types.html)を読むと、マクロの使い方がわかりませんでした。 'Q_DECLARE_METATYPE(MyClass);'がクラス自身のスコープの内部にある場合、コンパイルはエラー '名前空間以外のスコープ 'クラスMyClass'の明示的な特殊化で失敗します。この例は、マクロを挿入するための正しい場所を示しています。ありがとう! – fgiraldeau

関連する問題