0

我在派生的 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>>)。但这有可能吗?这有意义吗?

4

0 回答 0