我试图在QAbstractListModel中使用自定义类,而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 :: data时:
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
答案 0 :(得分:21)
您的示例过于简化,因为文档非常明确地声明传递给Q_DECLARE_METATYPE的类/结构必须具有默认构造函数,复制构造函数和公共析构函数:http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#Q_DECLARE_METATYPE
话虽如此,这是一个非常简单的例子,显示Q_DECLARE_METATYPE工作:
#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();
}