如何检查一个QPointF是否在一个QRect中?

11
我有一个小部件(widget)位于myWidget的中心,我在myWidget上使用了mousePressEvent()来获取鼠标按下事件。我想在鼠标按下时隐藏myWidget,但是当在小部件内按下时不隐藏。我可以通过event->windowPos()计算出按下位置(QPointF),也可以使用ui->widget->rect()获取QRect。
如何检查QPointF是否在QRect内?

1
它们已经在同一坐标系中吗?然后使用http://doc.qt.io/qt-5/qrectf.html#contains(虽然数学确实非常简单)。 - Frank Osterfeld
抱歉,矩形不在同一坐标系上。 - a.tabatabaei
2
不要将鼠标指针的位置与小部件的矩形进行比较,而是应该与小部件的geometry进行比较。我认为你还需要使用event->pos()而不是event->windowPos() - thuga
我使用了 if (ui->widget->geometry().contains(event->pos())) return;,一切正常。谢谢。 - a.tabatabaei
Function definition:函数定义: - a.tabatabaei
4个回答

12

使用:

if (ui->widget->geometry().contains(event->pos())) return;

3
为了更好地回答问题,我建议阅读:如何撰写一篇好的答案? - eyllanesc

6
我找到了另一个简单的方法来判断小部件上是否发生了按下事件。 如果(ui->widget->underMouse()) 执行某些操作();

0

我猜,你可以重写方法Widget::mousePressEvent(QMouseEvent* event)并在内部调用event->accept()

通过这样做,您将消耗鼠标按下事件,并且它不会传播到父级myWidget。因此,myWidget将仅获得发生在小部件几何图形之外的事件。


如果因为myWidget的动态声明而无法覆盖它怎么办? - a.tabatabaei
1
然后您可以在 Widget::mousePressEvent() 中使用函数Widget::childrenRegion(),并使用 QRegion::contains(QPoint) 检查事件的位置。希望这能有所帮助。 - paceholder
您也可以在myWidget构造函数内安装一个事件过滤器:widget->installEventFilter(this)。这样,您就能够在Widget::eventFilter(QObject *obj, QEvent *event)函数中接收到为myWidget创建的所有事件,然后简单地忽略它们。 - paceholder

0
使用 QRect 类的 contains 方法
bool QRect::contains(const QPoint &point, bool proper = false) const

如果给定的点在矩形内部或边缘上,则返回true,否则返回false。如果proper为true,则此函数仅在给定点在矩形内部(即不在边缘上)时返回true。
void MyWidget::mousePressEvent(QMouseEvent * event){

    if(rect.contains(event->pos())){ // here rect is an object of QRect
        ...
    }
}

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