From b2a1066e108678aa66d7e6f22cadf9c01d646ec9 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@qt.io> Date: Tue, 20 Jun 2017 10:27:44 +0200 Subject: [PATCH] Qt Designer: Suppress QEvent::LayoutRequest when changing layout span QTabWidget activates its parent layout when resizing, which prevents it from smoothly resizing when changing item spans. Suppress the QEvent::LayoutRequest when the widget handle is in a span-changing mode. Task-number: QTBUG-61439 Change-Id: I87b2c9d5e3e6796983b730907cf3bfe8c7ed2292 Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io> --- src/designer/src/components/formeditor/formwindow.h | 11 +++++++++++ .../src/components/formeditor/formwindowmanager.cpp | 8 ++++++++ .../src/components/formeditor/widgetselection.cpp | 13 +++++++++++++ 3 files changed, 32 insertions(+) diff --git a/src/designer/src/components/formeditor/formwindow.h b/src/designer/src/components/formeditor/formwindow.h index d2502f4a7..86027a625 100644 --- a/src/designer/src/components/formeditor/formwindow.h +++ b/src/designer/src/components/formeditor/formwindow.h @@ -70,6 +70,13 @@ class QT_FORMEDITOR_EXPORT FormWindow: public FormWindowBase Q_OBJECT public: + enum HandleOperation + { + NoHandleOperation, + ResizeHandleOperation, + ChangeLayoutSpanHandleOperation + }; + explicit FormWindow(FormEditor *core, QWidget *parent = 0, Qt::WindowFlags flags = 0); virtual ~FormWindow(); @@ -199,6 +206,9 @@ public: bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE; + HandleOperation handleOperation() const { return m_handleOperation; } + void setHandleOperation(HandleOperation o) { m_handleOperation = o; } + signals: void contextMenuRequested(QMenu *menu, QWidget *widget); @@ -354,6 +364,7 @@ private: QStringList m_includeHints; QPoint m_contextMenuPosition; + HandleOperation m_handleOperation = NoHandleOperation; private: friend class WidgetEditorTool; diff --git a/src/designer/src/components/formeditor/formwindowmanager.cpp b/src/designer/src/components/formeditor/formwindowmanager.cpp index 498160f8a..1650e1450 100644 --- a/src/designer/src/components/formeditor/formwindowmanager.cpp +++ b/src/designer/src/components/formeditor/formwindowmanager.cpp @@ -209,6 +209,14 @@ bool FormWindowManager::eventFilter(QObject *o, QEvent *e) return true; } switch (eventType) { + case QEvent::LayoutRequest: + // QTBUG-61439: Suppress layout request while changing the QGridLayout + // span of a QTabWidget, which sends LayoutRequest in resizeEvent(). + if (fw->handleOperation() == FormWindow::ChangeLayoutSpanHandleOperation) { + e->ignore(); + return true; + } + break; case QEvent::WindowActivate: { if (fw->parentWidget()->isWindow() && fw->isMainContainer(managedWidget) && activeFormWindow() != fw) { diff --git a/src/designer/src/components/formeditor/widgetselection.cpp b/src/designer/src/components/formeditor/widgetselection.cpp index eda77e213..fcb54de92 100644 --- a/src/designer/src/components/formeditor/widgetselection.cpp +++ b/src/designer/src/components/formeditor/widgetselection.cpp @@ -178,6 +178,17 @@ void WidgetHandle::mousePressEvent(QMouseEvent *e) m_origPressPos = container->mapFromGlobal(e->globalPos()); m_geom = m_origGeom = m_widget->geometry(); + + switch (WidgetSelection::widgetState(m_formWindow->core(), m_widget)) { + case WidgetSelection::UnlaidOut: + case WidgetSelection::LaidOut: + m_formWindow->setHandleOperation(FormWindow::ResizeHandleOperation); + break; + case WidgetSelection::ManagedGridLayout: + case WidgetSelection::ManagedFormLayout: + m_formWindow->setHandleOperation(FormWindow::ChangeLayoutSpanHandleOperation); + break; + } } void WidgetHandle::mouseMoveEvent(QMouseEvent *e) @@ -326,6 +337,8 @@ void WidgetHandle::mouseMoveEvent(QMouseEvent *e) void WidgetHandle::mouseReleaseEvent(QMouseEvent *e) { + m_formWindow->setHandleOperation(FormWindow::NoHandleOperation); + if (e->button() != Qt::LeftButton || !m_active) return; -- GitLab