Prevent crash in QWidgetWindow::handleMouseEvent().

Don't use mapFrom() between widgets not in the same hierarchy.
This commit is contained in:
Samuel Rødal 2011-05-10 12:09:40 +02:00
parent 5dc3a46a2a
commit d1622207ba

View File

@ -112,10 +112,19 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event)
void QWidgetWindow::handleMouseEvent(QMouseEvent *event) void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
{ {
// which child should have it? // which child should have it?
QWidget *widget = m_implicit_mouse_grabber ? m_implicit_mouse_grabber.data() : m_widget->childAt(event->pos()); QPoint mapped = event->pos();
QWidget *widget = 0;
if (m_implicit_mouse_grabber) {
widget = m_implicit_mouse_grabber.data();
mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->pos()));
} else if ((widget = m_widget->childAt(event->pos()))) {
mapped = widget->mapFrom(m_widget, event->pos());
}
if (qApp->d_func()->inPopupMode()) { if (qApp->d_func()->inPopupMode()) {
widget = qApp->activePopupWidget(); widget = qApp->activePopupWidget();
mapped = widget->mapFromGlobal(m_widget->mapToGlobal(event->pos()));
m_implicit_mouse_grabber.clear(); m_implicit_mouse_grabber.clear();
} }
@ -128,8 +137,6 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
if (event->buttons() == Qt::NoButton) if (event->buttons() == Qt::NoButton)
m_implicit_mouse_grabber.clear(); m_implicit_mouse_grabber.clear();
QPoint mapped = widget->mapFrom(m_widget, event->pos());
if (widget != qt_last_mouse_receiver) { if (widget != qt_last_mouse_receiver) {
QApplicationPrivate::dispatchEnterLeave(widget, qt_last_mouse_receiver); QApplicationPrivate::dispatchEnterLeave(widget, qt_last_mouse_receiver);
qt_last_mouse_receiver = widget; qt_last_mouse_receiver = widget;