当一个小部件进入另一个小部件的某个距离/区域时,如何触发信号?

时间:2016-08-20 06:37:17

标签: python qt pyqt widget position

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

Please refer the Figure

1 个答案:

答案 0 :(得分:0)

当移动任何其他窗口小部件(例如Widget1)以使其落在Widget2周围的感兴趣区域内时,您似乎希望Widget1发出信号。一种方法是覆盖移动小部件'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大小,则发出信号。