[英]How to cast QList<QObject *> to QList<ADerivedQObjectClass*>
我無法找到一個方法來投下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");
預先感謝您的幫助。
由於最后需要的是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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.