【问题标题】:Qt: What's the best way to swap QGraphicsRectItem positionsQt:交换 QGraphicsRectItem 位置的最佳方法是什么
【发布时间】:2017-11-24 15:04:28
【问题描述】:

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

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

主类中的Function(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


【问题讨论】:

  • 除了.pro之外,您还必须上传文件.ui和main.cpp。
  • @eyllanesc 有一个包含所有源文件的文件夹drive.google.com/drive/folders/…
  • 你说它适用于这两种算法,我看到它有效,我的问题,在什么情况下它不起作用?
  • 当我尝试交换列位置时它不起作用,只是因为我真的不知道如何。正因为如此,我创建了适用于冒泡排序和鸡尾酒排序的函数,只是因为这些算法一个接一个地检查元素 1,所以这意味着如果可以交换,我只需将 n 列 pos 增加列宽,并减少 k列 pos 按列宽
  • void on_comparision(int n, int k) { auto nColumnPos = columns[n]-&gt;pos().x(); columns[n]-&gt;setX(columns[k]-&gt;pos().x()); columns[k]-&gt;setX(nColumnPos); std::swap(columns[n], columns[k]); } 这是我尝试使用的功能,但列甚至没有移动。

标签: c++ algorithm qt sorting swap


【解决方案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]);

插入

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多