有没有办法为QGraphicsItem指定选择区域?

时间:2013-09-23 06:27:42

标签: qt mouseevent qgraphicsitem

我有一些用QGraphicsRectItem绘制的直方图;其中一些长方形很长,有些短。虽然选择一个长矩形没有问题,但是对于短矩形可能有困难。

所以我想知道是否有办法指定会触发项目的mousePressEvent的自定义区域,因此矩形将具有相同的大小选择区域。

除了矩形,我还在同一行上绘制了一些文字。以某种方式对它们进行分组并为该组编写mousePressEvent会有帮助吗?

谢谢!

1 个答案:

答案 0 :(得分: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); 
};

在绘画功能中,您可以绘制直到可见条形高度的矩形,但在boundingRect中,返回完整的矩形。这样,条形图可以看得非常小,但是对象是全高的,并且会响应条形图可见区域上方的鼠标选择。

对于文本,您可以将其作为子对象添加到此对象,并在选择它时发出父级信号,或者扩展此Bar类的boundingRect并在paint函数中呈现它。

请注意,boundingRect是对象在本地坐标中表示的区域。如果您有一个未由矩形定义的对象,您还需要实现shape()函数。默认情况下,shape()调用boundingRect()。