gpt4 book ai didi

c++ - 如何将 QList 转换为 QList

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:34 27 4
gpt4 key购买 nike

我找不到使用另一个类模板将 QObjectsQList 转换为另一个 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);

关于c++ - 如何将 QList<QObject *> 转换为 QList<ADerivedQObjectClass*>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com