首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将QList<QObject *>转换为QList<ADerivedQObjectClass*>

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

Stack Overflow用户
提问于 2013-04-06 03:48:32
回答 1查看 4.7K关注 0票数 2

我找不到一种方法将QList of QObjects转换为另一个具有另一个类模板的QList。我有一个函数,它创建QObjects实例,然后返回一个QList。所以我的问题是,我能把这个QList转换成另一个具有不同模板类指针的QList吗?

我的代码:

代码语言:javascript
复制
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;
}

我想要这样的东西:

代码语言:javascript
复制
QList<AnyClass*> list = DbManager::listVO("AnyClass");

谢谢你提前帮忙。

EN

回答 1

Stack Overflow用户

发布于 2013-04-06 05:00:11

因为您最后需要的是一个QList<AnyClass*>,所以您可以尝试这样的方法(假设AnyClass是从QObject派生的)。

注意:,我对您的原始代码做了一些修改,以便引用您的列表,因为返回一个庞大的列表可能并不有效。我没有编译代码,但希望您能知道这个代码段中发生了什么

代码语言:javascript
复制
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*>。因此,保持原始代码的原样,并在您想要进行这种转换的地方实现这样的方法:

代码语言:javascript
复制
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)
        }
    }
}

你可以这样称呼它:

代码语言:javascript
复制
QList<QObject*> listQObjects = DbManager::listVO("AnyClass");
QList<AnyClass*> listAnyClass;
ConvertToAnyClassList(listQObjects,listAnyClass);

假设您有多个类型,因此您可能希望为每种类型实现如下所示的函数:

代码语言:javascript
复制
ConvertToUserList(listQObjects,listUserObjects);
ConvertToCountryList(listQObjects,listCountryObjects);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15846806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档