3

我有某种用 QGraphicsRectItem 绘制的直方图;这些矩形有些长,有些短。虽然选择长矩形没有问题,但可能会遇到短矩形的困难。

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

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

谢谢!

4

1 回答 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); 
};

在绘制函数中,您将绘制一个直到可见条高度的矩形,但在 boundingRect 中,返回完整的矩形。这样,条形图在视觉上可能非常小,但对象是全高的,并且会响应条形图可见区域上方的鼠标选择。

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

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

于 2013-09-23T08:38:08.987 回答