diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml index 32c2f5a0c8f49e9c8febbd03755615ff41759351..09f4f6c8fe48d24fd6b639cca832725f2557c74e 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/ItemDelegate.qml @@ -73,12 +73,8 @@ Item { id: mouseRegion anchors.fill: parent - property bool reallyPressed: false - property int pressedX - property int pressedY - onPressed: { - rootView.startDragAndDrop(itemLibraryEntry) + rootView.startDragAndDrop(mouseRegion, itemLibraryEntry) } } } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 5b2dc1034c157a0d32061d8c6db236142c40274e..e9d1ab13ba762bafd410c891d5a1fb65d3cac74a 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -48,6 +48,7 @@ #include <QTabBar> #include <QImageReader> #include <QMimeData> +#include <QMouseEvent> #include <QWheelEvent> #include <QMenu> #include <QApplication> @@ -55,10 +56,6 @@ #include <QShortcut> #include <QQuickItem> -#include <private/qquickwidget_p.h> // mouse ungrabbing workaround on quickitems -#include <private/qquickwindow_p.h> // mouse ungrabbing workaround on quickitems - - namespace QmlDesigner { ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : @@ -265,14 +262,7 @@ void ItemLibraryWidget::setResourcePath(const QString &resourcePath) updateSearch(); } -static void ungrabMouseOnQMLWorldWorkAround(QQuickWidget *quickWidget) -{ - const QQuickWidgetPrivate *widgetPrivate = QQuickWidgetPrivate::get(quickWidget); - if (widgetPrivate && widgetPrivate->offscreenWindow && widgetPrivate->offscreenWindow->mouseGrabberItem()) - widgetPrivate->offscreenWindow->mouseGrabberItem()->ungrabMouse(); -} - -void ItemLibraryWidget::startDragAndDrop(QVariant itemLibraryId) +void ItemLibraryWidget::startDragAndDrop(QQuickItem *mouseArea, QVariant itemLibraryId) { m_currentitemLibraryEntry = itemLibraryId.value<ItemLibraryEntry>(); @@ -283,9 +273,14 @@ void ItemLibraryWidget::startDragAndDrop(QVariant itemLibraryId) m_currentitemLibraryEntry.libraryEntryIconPath())); drag->setMimeData(mimeData); - drag->exec(); + /* Workaround for bug in Qt. The release event is not delivered for Qt < 5.9 if a drag is started */ + QMouseEvent event (QEvent::MouseButtonRelease, QPoint(-1, -1), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QApplication::sendEvent(mouseArea, &event); - ungrabMouseOnQMLWorldWorkAround(m_itemViewQuickWidget.data()); + QTimer::singleShot(0, [drag]() { + drag->exec(); + drag->deleteLater(); + }); } void ItemLibraryWidget::removeImport(const QString &name) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h index 946dfc9b7d09e823ce3c497f1d94cbc07f503f38..a831b4c5fd13da53b8f8c2703cd940016d3b1513 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.h @@ -84,7 +84,7 @@ public: void setModel(Model *model); - Q_INVOKABLE void startDragAndDrop(QVariant itemLibId); + Q_INVOKABLE void startDragAndDrop(QQuickItem *mouseArea, QVariant itemLibId); protected: void removeImport(const QString &name); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.pro b/src/plugins/qmldesigner/qmldesignerplugin.pro index 460a77a96ef01da11c16d8bab7ea243e13c83b80..a5261e0931a344d8e9872ee4fd1cf0b0e6c064cc 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.pro +++ b/src/plugins/qmldesigner/qmldesignerplugin.pro @@ -1,5 +1,4 @@ QT += quickwidgets -QT += widgets-private quick-private quickwidgets-private core-private gui-private #mouse ungrabbing workaround on quickitems CONFIG += exceptions INCLUDEPATH += $$PWD