我找不到用另一个类模板将QList
QObjects
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");
我想要这样的事情:
{{1}}
提前感谢您的帮助。
答案 0 :(得分:4)
由于您最终需要的是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);