我尝试在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发布于 2013-09-29 01:57:50
您的示例过于简单,因为文档非常清楚地声明传递给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();
}https://stackoverflow.com/questions/19069758
复制相似问题