C++ 将Qt对象(QgraphicsItem)转换为C++;类对象
我试图把Qt对象转换成一个C++类对象,在这样的循环中,C++ 将Qt对象(QgraphicsItem)转换为C++;类对象,c++,qt,qgraphicsscene,dynamic-cast,C++,Qt,Qgraphicsscene,Dynamic Cast,我试图把Qt对象转换成一个C++类对象,在这样的循环中, std::vector<PBWMPlugDeviceGraphicsItem*> deviceItms; for(int i=0; i<fScene->items().size(); i++) deviceItms.push_back(dynamic_cast<PBWMPlugDeviceGraphicsItem*>(fScene->items().at(i))); std::矢量设备
std::vector<PBWMPlugDeviceGraphicsItem*> deviceItms;
for(int i=0; i<fScene->items().size(); i++)
deviceItms.push_back(dynamic_cast<PBWMPlugDeviceGraphicsItem*>(fScene->items().at(i)));
std::矢量设备;
对于(int i=0;iitems().size();i++)
DeviceItems.push_back(动态_cast(fScene->items().at(i));
其中代码> PBWMPuteldGeice GraceSITEM是C++类。似乎,当项目总数大于某个阈值(例如
fScene->items().size()>900
)时,转换这些对象需要相当长的时间,因此我可以看到我的qgraphicscene
上的操作非常慢。我读到dynamic\u cast
有严重的性能问题
有没有其他好的/快速的方法可以达到同样的效果
谢谢 使用以下命令:
for (auto p: fScene->items())
deviceItms.push_back(dynamic_cast<PBWMPlugDeviceGraphicsItem*>(p));
for(自动p:fScene->items())
设备后推(动态投射(p));
两个重要区别:
- 它只调用一次
fScene->items()。除非该函数通过(const)引用返回,否则每次迭代检索和丢弃容器都是无用的开销,特别是当内容不应该在迭代之间更改时
- 它没有在
中使用索引并验证该索引,而是将C++11用于带有自动类型变量的循环。at()
仅在您怀疑索引是否有效(例如,当它是从用户输入时)时才有用,但如果您无法编写简单循环,则确实存在更重要的问题at()
vector::reserve()
预分配内存的第三次优化。如果你真的只有几个对象(是的,900是很少的),那么它可能很难被注意到。尽管如此,还是要做一些研究,因为这是一个你应该了解的工具
问题是调用
QList::at
,它返回对列表项的引用,从而导致QList
执行写时复制分离
最小的解决方案是调用QList::value
来获取指针,而不是在处调用
另一种解决方案是获取列表一次,如其他答案中所述。这种分离方式只会发生一次,即使您在
中使用
您还可以通过强制转换或临时变量强制使用常量版本的at
。谢谢大家!
你的建议很有用。我以以下方式实现(因为我不能使用C++11)
QList temp=fScene->items();
对于(int i=0;i您根本不转换任何“对象”,您只转换指针。请定义“非常慢”,是几秒钟还是几微秒?顺便说一句:您可能会在其中包含一些空指针,一个明显的性能影响是vector::at()
中的索引验证。什么是fScene->items()
return?C64先生的观点很好。反复检索然后丢弃向量不是一个好主意!fScene->Items()返回QGraphicscene上所有项目的列表,大约需要几秒钟(2-5)秒。谢谢,非常有用的提示!!谢谢你的建议!。我将尝试实施并让你知道性能!
for(int i=0; i<fScene->items().size(); i++)
deviceItms.push_back(dynamic_cast<PBWMPlugDeviceGraphicsItem*>(fScene->items().at(i)));
// Get the collection of items once, outside the loop
QList<QGraphicsItem *> items = fScene->items();
// For each graphics item in the collection...
for (int i = 0; i < items.size(); i++) {
deviceItems.push_back(dynamic_cast<PBWMPlugDeviceGraphicsItem*>(items.at(i)));
}
QList<QGraphicsItem*> temp= fScene->items();
for(int i=0; i<temp.size(); i++)
deviceItms.push_back(dynamic_cast<PBWMPlugDeviceGraphicsItem*>(temp[i]));