我在派生的 QGraphicsItem 类中将 QSharedPointer< MyClass > 的 QList 保存为 QVariant 时遇到问题。MyClass 是用作接口的抽象基类。我这样做是为了能够将所有“MyClass 子类”向上转换为基础 MyClass 并将它们全部放入一个容器(列表、地图等)中。
控制台输出:
kernel\qvariant.cpp(2150): QVariant::save: 无法保存类型 <'QList < QSharedPointer< MyClass> >' (类型 id: 1035)。
global\qglobal.cpp(3052):QVariant::save 中的 ASSERT 失败:“要保存的类型无效”,文件 kernel\qvariant.cpp,第 2151 行
代码摘要:
SampleClass::SampleClass()
{
qRegisterMetaType<QSharedPointer<MyClass> >("QSharedPointer<MyClass>");
qRegisterMetaType<QList<QSharedPointer<MyClass>>>("QList<QSharedPointer<MyClass>>");
QList<QSharedPointer<MyClass> > myClassList;
myClassList.append(...); // Just to make clear that the list is filled with QSharedPointer<MyClass>
QVariant varMyClass;
varMyClass.setValue(myClassList); //QVariant::fromValue(myClassList)
DerivedQGraphicsItem *newCustomItem = new DerivedQGraphicsItem;
newCustomItem->setData(Qt::UserRole, varMyClass);
}
这工作正常,但是当我将 newCustomItem 添加到 QGraphicsScene 并单击它时,会发生上述错误。似乎必须为 QSharedPointer< MyClass > 实现流运算符(QDataStream &operator<< 和 QDataStream &operator>>)。但这有可能吗?这有意义吗?