[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