Qt:交换 QGraphicsRectItem 位置的最佳方法是什么

Qt: What's the best way to swap QGraphicsRectItem positions


我正在创建排序算法的可视化。 我有一个 QGraphicsRectItems 的矢量,它们是在应用程序启动时生成的具有不同高度和相同宽度的列。它们正在被洗牌,然后添加到 QGraphicsScene。 Class named "algorithms" 对用于设置列高的浮点值向量进行排序。在交换时 - 它用两个整数向主 class 发出信号,所以它看起来像这样:

emit comparison(array[first element to swap], array[second element to swap]);

主 class 中的函数 (on_comparison) 与该信号相关联。当我试图交换这两个元素时出现了问题。我创建了一个变量来为其设置 n 列位置。之后我试图设置列的位置,所以我做了类似的事情:

void on_comparision(int n, int k)
{
   auto nColumnPos = columns[n]->pos().x();
   columns[n]->setX(columns[k]->pos().x());
   columns[k]->setX(nColumnPos);
}

但是没用。立场没有改变。 此外

qDebug() <<nColumnPos; 

显示值 = 0。

我想知道我的整个程序是否有效,所以我决定实现 2 个排序算法,将 2 个元素彼此交换,并将 on_comparison 函数修改为

columns[n]->setX(columns[n].pos().x() + columnsWidth);
columns[n]->setX(columns[n].pos().x() - columnsWidth);

它有效,但没有给出令人满意的结果。此功能仅适用于交换 2 彼此附近元素的排序算法,例如。 Bubblesort/cocktailsort.

我正在寻找答案,但没有找到任何有用的信息。


代码如下: https://gist.github.com/anonymous/e612e35a7c14eeb650099d4b997f437d


问题已解决。问题是我没有设置项目的位置,但只使用他们的矩形 属性。 on_comparision 函数应如下所示:

auto nRect = columns[n]->rect();
auto kRect = columns[k]->rect();
auto nColumnPos = nRect.left();
auto kColumnPos = kRect.left();

nRect.moveLeft(kColumnPos);
kRect.moveLeft(nColumnPos);

columns[n]->setRect(nRect);
columns[k]->setRect(kRect);
std::swap(columns[n], columns[k]);

取代了

auto nColumnPos = columns[n]->pos().x();
columns[n]->setX(columns[k]->pos().x());
columns[k]->setX(nColumnPos);
std::swap(columns[n], columns[k]);