[education/rkward] rkward/misc: Clean up. The important point seems to be not to create a second QMenuBar as a child of the main window, not even indirect, and hidden.

Thomas Friedrichsmeier null at kde.org
Sat Jul 2 10:45:45 BST 2022


Git commit fac6901caaa74e1e28ab95f01b5d7764c6561e05 by Thomas Friedrichsmeier.
Committed on 02/07/2022 at 09:44.
Pushed by tfry into branch 'master'.

Clean up. The important point seems to be not to create a second QMenuBar as a child of the main window, not even indirect, and hidden.

M  +13   -10   rkward/misc/rkxmlguipreviewarea.cpp
M  +3    -1    rkward/misc/rkxmlguipreviewarea.h

https://invent.kde.org/education/rkward/commit/fac6901caaa74e1e28ab95f01b5d7764c6561e05

diff --git a/rkward/misc/rkxmlguipreviewarea.cpp b/rkward/misc/rkxmlguipreviewarea.cpp
index 09774d7d..56b16daf 100644
--- a/rkward/misc/rkxmlguipreviewarea.cpp
+++ b/rkward/misc/rkxmlguipreviewarea.cpp
@@ -16,9 +16,9 @@ SPDX-License-Identifier: GPL-2.0-or-later
 #include <QVBoxLayout>
 #include <QDomElement>
 
-#include <kxmlguifactory.h>
-#include <kxmlgui_version.h>
-#include <ktoolbar.h>
+#include <KXMLGUIFactory>
+#include <KXMLGUIBuilder>
+#include <KToolBar>
 #include <KLocalizedString>
 
 #include "../windows/rkmdiwindow.h"
@@ -46,7 +46,10 @@ public:
 		return KXMLGUIBuilder::createContainer(parent, index, element, containerAction);
 	}
 	void removeContainer(QWidget *container, QWidget *parent, QDomElement &element, QAction *containerAction) override {
-		if (container == menubar) return; // do not delete this
+		if (container == menubar) {
+			menubar->clear();
+			return; // do not delete it
+		}
 		KXMLGUIBuilder::removeContainer(container, parent, element, containerAction);
 	}
 private:
@@ -60,11 +63,9 @@ RKXMLGUIPreviewArea::RKXMLGUIPreviewArea (const QString &label, QWidget* parent)
 	wrapper_widget = nullptr;
 	current = nullptr;
 	internal_layout = new QVBoxLayout(this);
-#if KXMLGUI_VERSION < QT_VERSION_CHECK(5, 80, 0)  // guestimate, earlier cutoff may be more correct
-	factory = new KXMLGUIFactory(new RKXMLGUIPreviewBuilder(this, new QMenuBar(this)), this);
-#else
-	factory = new KXMLGUIFactory(new KXMLGUIBuilder(this), this);
-#endif
+	menubar = new QMenuBar(nullptr); // it is important that the menubar never is a child of the main window, not even indirectly! https://bugs.kde.org/show_bug.cgi?id=416911
+	builder = new RKXMLGUIPreviewBuilder(this, menubar);
+	factory = new KXMLGUIFactory(builder, this);
 }
 
 RKXMLGUIPreviewArea::~RKXMLGUIPreviewArea () {
@@ -75,6 +76,9 @@ RKXMLGUIPreviewArea::~RKXMLGUIPreviewArea () {
 		current->setFactory (0);
 	}
 	if (wrapper_widget) wrapper_widget->deleteLater();
+	delete menubar;
+	delete builder;
+	delete factory;
 }
 
 void RKXMLGUIPreviewArea::setLabel (const QString& label) {
@@ -143,7 +147,6 @@ void RKXMLGUIPreviewArea::setWindow(RKMDIWindow* window) {
 void RKXMLGUIPreviewArea::prepareMenu () {
 	RK_TRACE (PLUGIN);
 
-	QMenuBar *menubar = findChild<QMenuBar*>(QString(), Qt::FindDirectChildrenOnly);
 	// flatten menu, and try to purge irrelevant actions
 	menu->clear ();
 	QList<QAction*> entries = menubar->actions ();
diff --git a/rkward/misc/rkxmlguipreviewarea.h b/rkward/misc/rkxmlguipreviewarea.h
index e9031d31..565b1e35 100644
--- a/rkward/misc/rkxmlguipreviewarea.h
+++ b/rkward/misc/rkxmlguipreviewarea.h
@@ -8,7 +8,6 @@ SPDX-License-Identifier: GPL-2.0-or-later
 #ifndef RKXMLGUIPREVIEWAREA_H
 #define RKXMLGUIPREVIEWAREA_H
 
-#include <kxmlguibuilder.h>
 #include <kparts/part.h>
 
 #include <QWidget>
@@ -20,6 +19,8 @@ class QMenu;
 class QToolButton;
 class QLabel;
 class RKMDIWindow;
+class KXMLGUIBuilder;
+class KXMLGUIFactory;
 
 class RKXMLGUIPreviewArea : public QWidget {
 	Q_OBJECT
@@ -43,6 +44,7 @@ private:
 	QMenuBar *menubar;
 	QPointer<KParts::Part> current;
 	KXMLGUIFactory *factory;
+	KXMLGUIBuilder *builder;
 	QVBoxLayout *internal_layout;
 };
 


More information about the rkward-tracker mailing list