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

Qt 有没有办法为QGraphicsItem指定选择区域?,qt,mouseevent,qgraphicsitem,Qt,Mouseevent,Qgraphicsitem,我有一些用QGraphicsRectItem绘制的柱状图;这些矩形有些长,有些短。虽然选择长矩形没有问题,但短矩形可能会有困难 因此,我想知道是否有一种方法可以指定自定义区域,从而触发项目的mousePressEvent,从而使矩形具有相同大小的选择区域 除了矩形,我还在同一条线上画了一些文字。以某种方式将它们分组并为该组编写mousePressEvent会有帮助吗 谢谢大家! 看看你所问问题的示例图像会很有用,但我想我知道这是什么意思 就个人而言,我只是创建自己的类,继承自QGraphicsI

我有一些用QGraphicsRectItem绘制的柱状图;这些矩形有些长,有些短。虽然选择长矩形没有问题,但短矩形可能会有困难

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

除了矩形,我还在同一条线上画了一些文字。以某种方式将它们分组并为该组编写mousePressEvent会有帮助吗


谢谢大家!

看看你所问问题的示例图像会很有用,但我想我知道这是什么意思

就个人而言,我只是创建自己的类,继承自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中,返回完整的矩形。这样,条可以明显地非常小,但对象是全高的,并且会对条可见区域上方的鼠标选择作出响应

对于文本,您可以将其作为子对象添加到此对象,并在选择它时向父对象发出信号,或者扩展此条形图类的boundingRect并在paint函数中渲染它


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

如果在场景中为mouseReleaseEvents实现自定义命中测试逻辑,该怎么办?例如,处理鼠标事件并在事件坐标下或附近查找图形对象。谢谢!这就是我要找的!事实上,这并不能解决问题。使用boundingRect,我可以使可选区域变小,但反过来不行。很明显,它不能大于物品的实际尺寸。我想我会试着避开看不见的矩形…听起来不对;boundingRect定义了对象的区域,因此无论它是什么,都是对象,除非您还实现了shape()函数。您必须确保绘制时不会超出boundingRect,否则您将开始看到图形问题和选择对象时出现的问题。但是,您可以在boundingRect内的任何位置绘制,而不必填充它。