[英]How to cast QList<QObject *> to QList<ADerivedQObjectClass*>
I can't find a way to cast a QList
of QObjects
to another QList
with another class template. 我无法找到一个方法来投下QList
的QObjects
到另一个QList
与其他类模板。 I have a function that creates instances of QObjects
and then return a QList
. 我有一个创建QObjects
实例,然后返回QList
的函数。 So my question is, can I cast that QList
to another QList
of different template class pointers ? 所以我的问题是,我可以将该QList
转换为不同模板类指针的另一个QList
吗?
My code: 我的代码:
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;
}
and I want something like this: 我想要这样的东西:
QList<AnyClass*> list = DbManager::listVO("AnyClass");
Thanks for help in advance. 预先感谢您的帮助。
Since what you need at the end is a QList<AnyClass*>
, you can try something like this (Assuming AnyClass
is derived from QObject
) 由于最后需要的是QList<AnyClass*>
,因此您可以尝试这样的操作(假设AnyClass
派生自QObject
)
Note: I did some modifications to your original code to pass your list by reference since returning a huge list might not that be efficient. 注意:我对原始代码做了一些修改,以通过引用传递列表,因为返回庞大的列表可能并不高效。 I didn't compile the code, but hoping you can figure out what is happening inside this snippet 我没有编译代码,但希望您能弄清楚这段代码中发生了什么
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)
)
}
And after calling DbManager::listVO(QString voname, QList<AnyClass*>& listAnyClass)
function, listAnyClass
will get populated accordingly. 并且在调用DbManager::listVO(QString voname, QList<AnyClass*>& listAnyClass)
函数之后,将相应地填充listAnyClass
。 This is efficient with contrast to returning a list. 与返回列表相比,这是有效的。
Edited: 编辑:
So in a nutshell you want to convert a QList<QObject*>
into QList<AnyClass*>
. 简而言之,您想将QList<QObject*>
转换为QList<AnyClass*>
。 So keep your original code as it is and implement a method like this where you wanna do this conversion: 因此,请保持原始代码不变,并在您要执行此转换的地方实现类似这样的方法:
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)
}
}
}
And you can call it like this: 您可以这样称呼它:
QList<QObject*> listQObjects = DbManager::listVO("AnyClass");
QList<AnyClass*> listAnyClass;
ConvertToAnyClassList(listQObjects,listAnyClass);
Suppose you have multiple types, so you may want to implement functions for each type like this: 假设您有多种类型,因此您可能需要为每种类型实现如下功能:
ConvertToUserList(listQObjects,listUserObjects);
ConvertToCountryList(listQObjects,listCountryObjects);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.