我正在创建排序算法的可视化。
我有一个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
答案 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]);