当一个小部件进入另一个小部件 distance/area 范围内时如何触发信号?

How to trigger a signal when one widget comes within some distance/area of another widget?

我想在一个小部件周围创建一个区域,这样如果有任何其他小部件进入该区域,该小部件就会发送一个信号。计算小部件与每个其他小部件之间的距离可能是一种选择,但问题是可能有多个小部件并且这可能很乏味。具体来说,小部件是一个QLabel,我正在使用QPoint来放置小部件。有解决问题的有效方法吗?

您似乎希望 Widget1 在任何其他小部件(例如 Widget2)移动时发出信号,使其落在 Widget1 附近的感兴趣区域内.一种方法是覆盖 moving 小部件的 moveEvent() 处理函数以通知 Widget1 它们的新位置。

此处理程序在小部件已移动且已位于新位置后调用。最简单的事情可能是在调用父级处理程序的实现之前,在其顶部粘贴一个自定义信号。类似于:

MyWidget::moveEvent(QMoveEvent *ev) {
    emit widgetMoved(ev->pos()); // emit signal with this widget's new position
    QLabel::moveEvent(ev);
}

这需要子类化 QLabel,声明 widgetMoved() 信号,并重新实现处理程序。您还可以在信号中发送 this 指针,以便 Widget1 立即知道哪个小部件发送了事件。 (这不是必需的,因为您可以使用 QObject::sender() 获得指向发送小部件的指针,但这可能更容易。)

然后在 Widget1 中写入一个插槽,连接到此信号,计算此移动的小部件与其自身之间的距离,如果该距离小于 ROI 大小,则发出信号。