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

时间:2017-11-24 15:04:28

标签: c++ algorithm qt sorting swap

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

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

主类中的函数(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的排序算法。冒泡/鸡尾酒排序。

我正在寻找答案,但没有找到任何帮助。

这是代码: https://gist.github.com/anonymous/e612e35a7c14eeb650099d4b997f437d

1 个答案:

答案 0 :(得分:1)

问题解决了。问题是我没有设置项目的位置,但只能使用他们的矩形属性。 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]);

insted of

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