gpt4 book ai didi

qt - 带有仿函数的 QAbstractItemModel foreach 迭代器 : is there a better way to do this?

转载 作者:行者123 更新时间:2023-12-02 01:03:17 24 4
gpt4 key购买 nike

我正在编辑 QDomModel 简单示例,为我的应用程序添加一些内容,并且需要清除我偶尔添加的一些状态标志。迭代 QAbstractItem 模型的项目有点烦人,因为没有提供标准迭代器,所以我编写了自己的 for_each 样式函数来迭代每个项目并对其执行函数“f”。

template<typename Functor>
void foreach_item(Functor f, QModelIndex &parent = QModelIndex())
{
if (!parent.isValid())
parent = index(0,0,QModelIndex());

int numRows = rowCount(parent);

for (int i=0; i<numRows; i++)
{
foreach_item(f,index(i,0,parent));
}

f(parent);
}

这可行,我可以给它各种很棒的 lambda 或仿函数,并像这样调用它:

void QDomModel::clearChanges()
{
foreach_item([&](QModelIndex parent)
{
QDomItem* item = static_cast<QDomItem*>(parent.internalPointer());
item->valueChanged = false;
});
changeCount = 0;
}

这非常强大,但我遇到的问题是,除非您深入研究代码,否则您不知道仿函数/lambda 的签名应该是什么。如果你给它错误的东西,你确实会得到一个编译错误,但我担心这对于创建这些类型的函数来说可能是一个糟糕的接口(interface)(或者通常是一个糟糕的编码实践)。

在接受参数时,为了清楚起见,询问函数指针是否更好?我应该注意一种方式与另一种方式相比是否有任何影响或限制?

最佳答案

std::function 将允许您公开签名中的类型。尝试这样的事情:

void foreach_item(const std::function<void(const QModelIndex&)> &f, QModelIndex parent = QModelIndex())
{
/*...*/
}

关于qt - 带有仿函数的 QAbstractItemModel foreach 迭代器 : is there a better way to do this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26040977/

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