繁体   English   中英

在QGraphicsItems中找到最大的X pos值

[英]Find largest X pos value in QGraphicsItems

如何遍历一组Qt QGraphicsItems并在所选图形项中找到最大X值。 我有一个似乎工作的功能,但我记得将min值设置为NULL并不理想。 我这样做的唯一原因是因为否则这个价值会疯狂地返回一些东西。 我只是不觉得我这样做是最有效的方式。 请记住,我要考虑实际图表项目本身的宽度。

float max = NULL;
    foreach (QGraphicsItem* item, items) {
        if (!item) continue;
        if (item->type() == NexusBlockItem::Type) {
            float x = item->pos().x() + item->sceneBoundingRect().width()*.5;
            if (max == NULL) max = x;
            if (x > max) {
                max = x;
            }
        }
    }

在此输入图像描述

我有一个似乎工作的功能,但我记得将min值设置为NULL并不理想。

实际上不可能将浮点值设置为NULL,因为在C ++中只有指针可以为NULL,而float不是指针类型。 你可能实际上在做什么是将max初始化为0.0f(因为NULL通常定义为0),但从概念上讲它没有任何意义,当然如果你的任何实际x位置它会弄乱你的结果小于零。

至于如何更好地做到这一点,你有两个我能想到的选择:

1)添加一个单独的maximum_value_is_set变量来跟踪你的max变量尚未初始化的时间。

float max;  // not initialized here, because...
bool maximum_value_is_set = false;  // we'll keep track of it this way instead

[...]

float x = item->pos().x() + item->sceneBoundingRect().width()*.5;
if ((maximum_value_is_set == false)||(x > max)) {
   max = x;
   maximum_value_is_set = true;
}

2)或者,您可以将max的默认值设置为可能的最小浮点值:

float max = -FLT_MAX;
[...]

......那样任何可以想象的x值都会大于max的原始值。

顺便说一句...

 float x = item->pos().x() + item->sceneBoundingRect().width()*.5;

为什么* .5在那里? 看起来这段代码计算矩形的中心,但根据你的图形,你对右侧更感兴趣(在这种情况下,我认为你想要摆脱* .5)。

此代码适用于您分享的内容。

float max = 0;
        foreach (QGraphicsItem* item, items) {
            if (!item) continue;
            if (item->type() == NexusBlockItem::Type) {
                float x = item->boundingRect().width();
                if (x > max) {
                    max = x;
                }
            }

但如果你的第二个项目或其他项目转移到更正确的权利

用品 - > boundingRect()windth(); 没有给出正确的价值。

“X”的最大值是多少? 是最大项目的宽度或场景矩形的宽度?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM