2013-04-06 6 views
2

Я не могу найти способ отличить QList от QObjects другому QList с другим шаблоном класса. У меня есть функция, которая создает экземпляры QObjects, а затем возвращает QList. Поэтому мой вопрос: могу ли я отнести это QList к другому QList различных указателей класса шаблонов?Как отличить QList <QObject *> в QList <ADerivedQObjectClass *>

Мой код:

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"); 

Спасибо за помощь заранее.

ответ

3

Так что вам нужно в конце концов, это 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); 
+0

спасибо, добавив список как параметр функции, это хорошая идея, но это включает класс AnyClass в стороне, и это то, чего я не хочу, потому что я не хочу связывать DbManager с другими классами, например, я хочу, чтобы этот код работал для списка пользователей, списка стран и т. д. (для этого является instantiateVO) , поэтому я хочу, чтобы он был общим (так работает только с QObjects). ¿Поэтому я мог бы создать, например, QList в качестве параметра, а затем заполнить его qObjects? (зная, что каждый qObjects уже является объектом User, переданным в QObject) –

+0

@DiegoFernandoMurilloValenci Отредактирован ответ – warunanc

Смежные вопросы