2013-09-28 13 views
11

Sto provando a utilizzare le classi personalizzate in QAbstractListModel e il Q_DECLARE_METATYPE non funziona affatto!Q_DECLARE_METATYPE non funziona affatto

Per verificare dove sia il problema, ho semplificato il codice come il seguente:

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

typedef int x; 
Q_DECLARE_METATYPE(x) 

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

e l'uscita è ancora falso!

btw, il codice che voglio implementare è come:

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

e quando cerco di reimplementare QAbstractListModel :: i dati in questo modo:

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

il compilatore segnalerà e errore come:

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

risposta

19

L'esempio è eccessivamente semplificato in quanto i documenti indicano chiaramente che la classe/struct bei ng passato a Q_DECLARE_METATYPE deve avere un costruttore di default, un costruttore di copia e un distruttore pubblico: http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#Q_DECLARE_METATYPE

Detto questo, ecco una piuttosto semplice esempio che mostra Q_DECLARE_METATYPE di lavoro:

#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

sì, all'improvviso mi rendo conto dove il il problema è il problema è che quando si implementa 'MyModel :: data (const QModelIndex e index, int role) const, dovrei usare' return QVariant :: fromValue (MyClass) 'piuttosto che' return Myclass'. – user2826776

+0

Leggendo il [Qt custom type doc] (http://doc.qt.io/qt-5/custom-types.html), non ero sicuro di come usare la macro. Quando 'Q_DECLARE_METATYPE (MyClass);' è all'interno dell'ambito della classe stessa, la compilazione fallisce con l'errore 'specializzazione esplicita in classe MyClass 'non di spazio dei nomi'. L'esempio mostra la posizione corretta per inserire la macro. Grazie! – fgiraldeau

Problemi correlati