Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将Qt对象(QgraphicsItem)转换为C++;类对象_C++_Qt_Qgraphicsscene_Dynamic Cast - Fatal编程技术网

C++ 将Qt对象(QgraphicsItem)转换为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::矢量设备

我试图把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::矢量设备;
对于(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)引用返回,否则每次迭代检索和丢弃容器都是无用的开销,特别是当内容不应该在迭代之间更改时
  • 它没有在
    at()
    中使用索引并验证该索引,而是将C++11用于带有自动类型变量的循环。
    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]));