如何将 QList<QObject *> 转换为 QList<ADerivedQObjectClass*>

How to cast QList<QObject *> to QList<ADerivedQObjectClass*>

本文关键字:gt lt QList 转换 ADerivedQObjectClass QObject      更新时间:2023-10-16

我找不到用另一个类模板将QObjectsQList转换为另一个QList的方法。我有一个创建QObjects实例的函数,然后返回QList。所以我的问题是,我可以将QList转换为不同模板类指针的另一个QList吗?

我代码:

QList<QObject *> DbManager::listVO(QString voname)
{
    DbManager::VOPropertiesJoin(DbManager::VOKeys(obj),VOJOIN_BOTH,"=");
    QList<QObject *> vos;
    QString voquery = "select * from %1";
    voquery = voquery.arg(voname);
    QSqlQueryModel *volist = DbManager::makeSelect(voquery);
    for(int i = 0;i < volist->rowCount();i++){
        QSqlRecord record =volist->record(i);
        QObject *voinstance = DbManager::instantiateVO(voname,record.value(0),record.value(1),record.value(2),record.value(3),record.value(4),record.value(5),record.value(6),record.value(7));
        vos << voinstance;
    }
    return vos;
}

我想要这样写:

QList<AnyClass*> list = DbManager::listVO("AnyClass");

提前感谢您的帮助

由于您最后需要的是QList<AnyClass*>,因此您可以尝试这样做(假设AnyClass派生自QObject)

注意:我对你的原始代码做了一些修改,通过引用传递你的列表,因为返回一个巨大的列表可能不是有效的。我没有编译代码,但希望你能弄清楚这段代码

里面发生了什么。
void DbManager::listVO(QString voname, QList<AnyClass*>& listAnyClass)
{
    DbManager::VOPropertiesJoin(DbManager::VOKeys(obj),VOJOIN_BOTH,"=");
    // Initialise list with an empty list
    listAnyClass = QList<AnyClass*>();
    QString voquery = "select * from %1";
    voquery = voquery.arg(voname);
    QSqlQueryModel *volist = DbManager::makeSelect(voquery);
    for(int i = 0; i < volist->rowCount(); i++)
    {
        QObject *voinstance = GetInstance(voname, volist->record(i));
        // Trying to cast into an AnyClass
        AnyClass* pAnyClass = qobject_cast<AnyClass*>(voinstance);
        // If pAnyClass is a valid AnyClass* update your list
        if(pAnyClass)
        {
            listAnyClass.append(pAnyClass);
        }
    }
}
QObject* DbManager::GetInstance(QString sVoname, const QSqlRecord& record)
{
    return DbManager::instantiateVO
    (
        voname,
        record.value(0),
        record.value(1),
        record.value(2),
        record.value(3),
        record.value(4),
        record.value(5),
        record.value(6),
        record.value(7)
    )
}

调用DbManager::listVO(QString voname, QList<AnyClass*>& listAnyClass)函数后,相应填充listAnyClass。与返回列表相比,这是有效的。

编辑:

所以简单地说,你想把QList<QObject*>转换成QList<AnyClass*>。保持原始代码不变并在你想要的地方实现这样的功能执行以下转换:

void ConvertToAnyClassList(const QList<QObject*>& listQObjects, QList<AnyClass*>& listAnyClass)
{
    listAnyClass = QList<AnyClass*>();
    for( int i = 0; i < listQObjects.length(); ++i )
    {
        AnyClass* pAnyClass = qobject_cast<AnyClass*>(listQObjects.at(i));
        if(pAnyClass)
        {
            listAnyClass.append(pAnyClass)
        }
    }
}

你可以这样命名它:

QList<QObject*> listQObjects = DbManager::listVO("AnyClass");
QList<AnyClass*> listAnyClass;
ConvertToAnyClassList(listQObjects,listAnyClass);

假设您有多个类型,那么您可能希望为每个类型实现这样的函数:

ConvertToUserList(listQObjects,listUserObjects);
ConvertToCountryList(listQObjects,listCountryObjects);