有没有一种方法可以指定QGraphicsItem的选择区域?

3

我有一些用QGraphicsRectItem绘制的柱状图,其中一些矩形很长,一些很短。选择长矩形没有问题,但对于短矩形可能会有困难。

所以我想知道是否有一种方法可以指定自定义区域,以触发项目的mousePressEvent,这样矩形就会有相同大小的选择区域。

除了矩形之外,我还在同一行上绘制了一些文本。将它们分组并为组编写mousePressEvent是否有帮助?

谢谢!


如果您在场景中实现自定义的mouseReleaseEvents命中测试逻辑怎么办?例如,处理鼠标事件并找到位于事件坐标下方附近的图形对象。 - vahancho
1个回答

3

如果能看到您所询问的示例图像将会很有帮助,但我认为我知道您的意思。

个人而言,我会创建自己的类,继承自QGraphicsItem(如果需要信号和槽,则继承自QGraphicsObject)。然后,该类可以提供要表示选择区域的完整区域的boundingRect(),但paint()函数仅绘制条形的可见部分。类似以下代码:

class Bar: public QGraphicsItem
{
    Q_OBJECT

    public:
        Bar(int x, int y, int width, int height, int visibleBarHeight);

        // returns the area of the object
        QRectF boundingRect() const;

        void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); 
};

在paint函数中,您需要绘制一个高度为可见条的矩形,但在boundingRect函数中,返回完整的矩形。这样,该条可以在视觉上非常小,但对象的高度是完整的,并且会响应鼠标选择超出条的可见区域。
至于文本,您可以将其作为此对象的子项添加,并在其被选择时向父项发出信号,或者扩展该Bar类的boundingRect并在paint函数中呈现它。
请注意,boundingRect是由对象在本地坐标系中表示的区域。如果您有一个不是由矩形定义的对象,您还需要实现shape()函数。默认情况下,shape()会调用boundingRect()函数。

实际上,这并没有解决问题。使用boundingRect可以使可选择区域变小,但不能反过来。显然,它不能比项目的实际大小更大。 我想我会尝试使用不可见矩形来解决问题... - msgmaxim
那听起来不太对劲;boundingRect 定义了对象的区域,所以无论它是什么,都是该对象,除非您还实现了 shape() 函数。您必须确保不要绘制超出 boundingRect 的范围,否则您将开始看到图形问题和选择对象的问题。但是,您可以在 boundingRect 内的任何位置绘制,而不必填充它。 - TheDarkKnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接