QmlDesigner: Prevent freezing while doing drag&drop on some Windows

systems

QWidget::grabMouse() might freeze if there are e.g. misbehaving virus
scanners installed. This is why e.g. qdockwidget.cpp doesn't use
grabMouse(), but QWidgetPrivate::grabMouseWhileInWindow().

As a hot fix we do the very same now in creator, at the cost of
including the private header qwidget_p.h.

Task-number: BAUHAUS-772
Task-number: QTBUG-11301
This commit is contained in:
Kai Koehne
2010-06-08 16:43:29 +02:00
parent 313d30654e
commit 1373fc13a6
2 changed files with 20 additions and 2 deletions

View File

@@ -38,6 +38,10 @@
#include <QDebug> #include <QDebug>
#include <QPainter> #include <QPainter>
#ifdef Q_OS_WIN
#include <private/qwidget_p.h>
#endif
namespace QmlDesigner { namespace QmlDesigner {
namespace QmlDesignerItemLibraryDragAndDrop { namespace QmlDesignerItemLibraryDragAndDrop {
@@ -54,7 +58,20 @@ void CustomDragAndDropIcon::startDrag()
raise(); raise();
show(); show();
grabMouseSafely();
}
void CustomDragAndDropIcon::grabMouseSafely()
{
#ifdef Q_OS_WIN
// grabMouse calls SetWindowsHookEx() - this function causes a system-wide
// freeze if any other app on the system installs a hook and fails to
// process events.
QWidgetPrivate *p = qt_widget_private(this);
p->grabMouseWhileInWindow();
#else
grabMouse(); grabMouse();
#endif
} }
void CustomDragAndDropIcon::mouseReleaseEvent(QMouseEvent *event) void CustomDragAndDropIcon::mouseReleaseEvent(QMouseEvent *event)
@@ -108,7 +125,8 @@ void CustomDragAndDropIcon::mouseMoveEvent(QMouseEvent *event)
leave(); // trigger animation if we leave a widget that accepted leave(); // trigger animation if we leave a widget that accepted
// the drag enter event // the drag enter event
} }
grabMouse(); //enable the mouse grabber again - after the curser is set //enable the mouse grabber again - after the curser is set
grabMouseSafely();
} else { } else {
if (CustomDragAndDrop::isAccepted()) // create DragMoveEvents if the current widget if (CustomDragAndDrop::isAccepted()) // create DragMoveEvents if the current widget
// accepted the DragEnter event // accepted the DragEnter event
@@ -231,7 +249,6 @@ void CustomDragAndDrop::startCustomDrag(const QPixmap icon, const QPixmap previe
instance()->m_widget->setIcon(icon); instance()->m_widget->setIcon(icon);
instance()->m_widget->setPreview(preview); instance()->m_widget->setPreview(preview);
instance()->m_widget->startDrag(); instance()->m_widget->startDrag();
} }
bool CustomDragAndDrop::customDragActive() bool CustomDragAndDrop::customDragActive()

View File

@@ -54,6 +54,7 @@ public:
void enter(); void enter();
void leave(); void leave();
void startDrag(); void startDrag();
void grabMouseSafely();
public slots: public slots:
void animateDrag(int frame); void animateDrag(int frame);