Так что вам нужно в конце концов, это 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);
спасибо, добавив список как параметр функции, это хорошая идея, но это включает класс AnyClass в стороне, и это то, чего я не хочу, потому что я не хочу связывать DbManager с другими классами, например, я хочу, чтобы этот код работал для списка пользователей, списка стран и т. д. (для этого является instantiateVO) , поэтому я хочу, чтобы он был общим (так работает только с QObjects). ¿Поэтому я мог бы создать, например, QList в качестве параметра, а затем заполнить его qObjects? (зная, что каждый qObjects уже является объектом User, переданным в QObject) –
@DiegoFernandoMurilloValenci Отредактирован ответ – warunanc