2013-04-06 158 views
2

我找不到一种方法将QListQObjects转换为另一个QList与另一个类模板。我有一个函数可以创建QObjects的实例,然后返回QList。所以我的问题是,我可以将QList转换为另一个不同模板类指针的QList吗?如何将QList <QObject *>转换为QList <ADerivedQObjectClass *>

我的代码:

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"); 

感谢您的帮助提前。

回答

3

既然你需要在到底什么是QList<AnyClass*>,你可以尝试这样的事情(假设AnyClassQObject派生)

注:我做了一些修改原密码被通过你的列表因为返回一个巨大的列表可能不是很有效。我没编译代码,但希望你能弄清楚这是什么片段

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); 
+0

谢谢,添加列表像函数的参数它的一个好主意,但这包括AnyClass类在这是我不想要的功能,因为我不想将DbManager与其他类绑定在一起,例如我想要此代码为用户列表,国家列表等等(为了实例化VO) ,所以我希望它是通用的(所以只适用于QObject)。 ¿所以我可以创建一个,例如,QList 作为参数,然后用qObjects填充它? (知道每个qObjects已经是QObject的用户对象) – 2013-04-06 05:37:36

+0

@DiegoFernandoMurilloValenci编辑答案 – warunanc 2013-04-06 06:29:47

相关问题