最後に必要なのは であるため、次のようなことを試すことができます(から派生した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
それに応じてデータが入力されます。リストを返すのとは対照的に、これは効率的です。
編集:
つまり、一言で言えば、 a を に変換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);