我目前正在开发一个执行某些计算几何的库。为了可视化我的算法的结果(并在交互式设置中使用它们),我决定在Qt
中编写一个小的查看器/工具,但保持核心逻辑与此查看器分开。所以现在我有一个QGraphicsScene
包含一堆不同的项目,但是,我只对QGraphicsRectItems
感兴趣:
for(auto* item : scene) {
if(QGraphicsRectItem* c = qgraphicsitem_cast<QGraphicsRectItem*>(item)) {
// ... do stuff
}
}
我的图书馆目前定义了我自己的类型
struct rectangle {
double x,y;
double w,h;
};
以及适用于它们的算法。想象一下,我有一个方法
void layout(std::vector<rectangle>& rs) { ... }
采用任意定位rectangles
的集合,并将它们全部放在一起。
我现在想在场景中使用此算法和我的QGraphicsRectItems
。你会怎么做?我原以为我可以将QGraphicsItems
转换为rectangles
,将矩形存储在矢量中并使用std::unordered_map<rectangle*,QGraphicsRectItem*>
来跟踪它们属于哪个项目。完成处理后rectangles
我可以迭代向量并将更改应用于场景中的项目。
这是要走的路吗?你会如何解决这个问题?也许我的设计从一开始就存在缺陷?
答案 0 :(得分:1)
如果场景具有稳定的排序,并且布局编辑条目而不“重新排序”它们,则迭代场景。
使用回推为场景中的每个元素将一个矩形填充到矢量中。
做布局。
反转矢量。
迭代场景,在每个场景元素的矢量末尾弹出新位置。
你可能会搞乱指针或索引,但上面的行为是一次通过队列并起作用。
你从场景开始:
qA qB qC qD qE qF qG
然后我们创建一个rects矢量:
rA rB rC rD rE rF rG
我们将它们处理为小写:
ra rb rc rd re rf rg
然后反转:
rg rf re rd rc rb ra
现在我们遍历qt场景并弹出:
current | stack [top of stack]
qA:ra | rg rf re rd rc rb [ra]
qB:rb | rg rf re rd rc [rb]
qC:rc | rg rf re rd [rc]
等