[education/rkward] /: Proof of concept QWebview-based HTML window

Thomas Friedrichsmeier null at kde.org
Thu Apr 9 20:44:24 BST 2026


Git commit 618ac10ef7c9fa490cbdd8a3b2731b38ab6eecef by Thomas Friedrichsmeier.
Committed on 09/04/2026 at 19:44.
Pushed by tfry into branch 'master'.

Proof of concept QWebview-based HTML window

M  +1    -1    CMakeLists.txt
M  +2    -0    rkward/main.cpp
M  +3    -0    rkward/resources.qrc
M  +2    -1    rkward/windows/CMakeLists.txt
M  +3    -1    rkward/windows/rkhtmlviewer.cpp
A  +103  -0    rkward/windows/rkqwebview.cpp     [License: GPL(v2.0+)]
A  +43   -0    rkward/windows/rkqwebview.h     [License: GPL(v2.0+)]
A  +22   -0    rkward/windows/rkqwebview.qml     [License: GPL(v2.0+)]

https://invent.kde.org/education/rkward/-/commit/618ac10ef7c9fa490cbdd8a3b2731b38ab6eecef

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4e6b12242..327cac8f0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,7 +27,7 @@ INCLUDE(ECMAddAppIcon)
 INCLUDE(ECMMarkNonGuiExecutable)
 INCLUDE(FeatureSummary)
 
-FIND_PACKAGE(Qt6 6.6 CONFIG REQUIRED COMPONENTS Widgets Core Xml Network Qml PrintSupport WebEngineWidgets)
+FIND_PACKAGE(Qt6 6.6 CONFIG REQUIRED COMPONENTS Widgets Core Xml Network Qml PrintSupport WebEngineWidgets WebView)
 FIND_PACKAGE(KF6 6.0.0 REQUIRED COMPONENTS CoreAddons DocTools I18n XmlGui TextEditor WidgetsAddons Parts Config Notifications WindowSystem Archive BreezeIcons OPTIONAL_COMPONENTS Crash)
 FIND_PACKAGE(Gettext REQUIRED)
 
diff --git a/rkward/main.cpp b/rkward/main.cpp
index d8b9c7f26..c69dbb753 100644
--- a/rkward/main.cpp
+++ b/rkward/main.cpp
@@ -59,6 +59,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
 #include <QThread>
 #include <QTime>
 #include <QUrl>
+#include <QtWebView>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -153,6 +154,7 @@ int main(int argc, char *argv[]) {
 	scheme.setFlags(QWebEngineUrlScheme::LocalAccessAllowed);
 	QWebEngineUrlScheme::registerScheme(scheme);
 	BreezeIcons::initIcons(); // install as fallback theme. Too many issues with missing icons, otherwise
+	QtWebView::initialize();
 	QApplication app(argc, argv);
 	KDSingleApplication app_singleton;
 #if defined(Q_OS_MACOS) || defined(Q_OS_WIN)
diff --git a/rkward/resources.qrc b/rkward/resources.qrc
index 43e1be17a..19b89ffd0 100644
--- a/rkward/resources.qrc
+++ b/rkward/resources.qrc
@@ -24,4 +24,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
 <qresource prefix="/org.kde.syntax-highlighting/syntax-addons">
 	<file alias="rkward.xml">syntax/rkward.xml</file>
 </qresource>
+<qresource prefix="/qml">
+	<file alias="rkqwebview.qml">windows/rkqwebview.qml</file>
+</qresource>
 </RCC>
diff --git a/rkward/windows/CMakeLists.txt b/rkward/windows/CMakeLists.txt
index d3bb67b98..2192b66a3 100644
--- a/rkward/windows/CMakeLists.txt
+++ b/rkward/windows/CMakeLists.txt
@@ -13,6 +13,7 @@ SET(windows_STAT_SRCS
 	rkhtmlwindow.cpp
 	rkhtmlviewer.cpp
 	rkqwebenginewidget.cpp
+	rkqwebview.cpp
 	rkpdfwindow.cpp
 	rcontrolwindow.cpp
 	detachedwindowcontainer.cpp
@@ -35,4 +36,4 @@ SET(windows_STAT_SRCS
 )
 
 ADD_LIBRARY(windows STATIC ${windows_STAT_SRCS})
-TARGET_LINK_LIBRARIES(windows Qt6::Widgets Qt6::PrintSupport Qt6::WebEngineWidgets KF6::TextEditor KF6::Notifications KF6::WindowSystem KF6::KIOFileWidgets KF6::I18n)
+TARGET_LINK_LIBRARIES(windows Qt6::Widgets Qt6::PrintSupport Qt6::WebEngineWidgets Qt6::WebView Qt6::Qml Qt6::Quick Qt6::QuickWidgets KF6::TextEditor KF6::Notifications KF6::WindowSystem KF6::KIOFileWidgets KF6::I18n)
diff --git a/rkward/windows/rkhtmlviewer.cpp b/rkward/windows/rkhtmlviewer.cpp
index 058ab113c..47c356847 100644
--- a/rkward/windows/rkhtmlviewer.cpp
+++ b/rkward/windows/rkhtmlviewer.cpp
@@ -8,6 +8,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
 #include "rkhtmlviewer.h"
 
 #include "rkqwebenginewidget.h"
+#include "rkqwebview.h"
 
 #include "../debug.h"
 
@@ -17,7 +18,8 @@ RKHTMLViewer::RKHTMLViewer(QObject *parent) : QObject(parent) {
 
 RKHTMLViewer *RKHTMLViewer::getNew(RKHTMLWindow *parent) {
 	RK_TRACE(APP);
-	return new RKQWebEngineWidget(parent);
+	//return new RKQWebEngineWidget(parent);
+	return new RKQWebView(parent);
 }
 
 #include "rkhtmlviewer.moc"
diff --git a/rkward/windows/rkqwebview.cpp b/rkward/windows/rkqwebview.cpp
new file mode 100644
index 000000000..df9462428
--- /dev/null
+++ b/rkward/windows/rkqwebview.cpp
@@ -0,0 +1,103 @@
+/*
+rkqwebview - This file is part of the RKWard project. Created: Sun Feb 08 2026
+SPDX-FileCopyrightText: 2026 by Thomas Friedrichsmeier <thomas.friedrichsmeier at kdemail.net>
+SPDX-FileContributor: The RKWard Team <rkward at kde.org>
+SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#include "rkqwebview.h"
+
+#include <QMenu>
+#include <QQuickItem>
+#include <QQuickWidget>
+
+#include "rkhtmlwindow.h"
+
+#include "../debug.h"
+
+RKQWebView::RKQWebView(RKHTMLWindow *parent) : RKHTMLViewer(parent) {
+	RK_TRACE(APP);
+}
+
+QWidget *RKQWebView::createWidget(QWidget *parent) {
+	RK_TRACE(APP);
+	view = new QQuickWidget(parent);
+	view->setSource(QUrl(QStringLiteral("qrc:/qml/rkqwebview.qml")));
+	view->setResizeMode(QQuickWidget::SizeRootObjectToView);
+	return view;
+}
+
+QUrl RKQWebView::url() const {
+	RK_TRACE(APP);
+	return QUrl();
+}
+
+void RKQWebView::load(const QUrl &url) {
+	RK_TRACE(APP);
+	auto wv = view->rootObject()->findChild<QObject *>("webView");
+	RK_ASSERT(wv);
+	if (!wv) return;
+	wv->setProperty("url", url);
+}
+
+void RKQWebView::print() {
+	RK_TRACE(APP);
+}
+
+void RKQWebView::installPersistentJS(const QString &script, const QString &id) {
+	RK_TRACE(APP);
+}
+
+void RKQWebView::runJS(const QString &script, std::function<void(const QVariant &)> callback) {
+	RK_TRACE(APP);
+}
+
+void RKQWebView::setHTML(const QString &html, const QUrl &url) {
+	RK_TRACE(APP);
+}
+
+bool RKQWebView::installHelpProtocolHandler() {
+	RK_TRACE(APP);
+	return false;
+}
+
+void RKQWebView::findRequest(const QString &text, bool backwards, RKFindBar *findbar, bool *found) {
+	RK_TRACE(APP);
+}
+
+QMenu *RKQWebView::createContextMenu(const QPoint &clickpos) {
+	RK_TRACE(APP);
+	return new QMenu();
+}
+
+QString RKQWebView::selectedText() const {
+	RK_TRACE(APP);
+
+	return QString();
+}
+
+void RKQWebView::exportPage() {
+	RK_TRACE(APP);
+}
+
+QPoint RKQWebView::scrollPosition() const {
+	RK_TRACE(APP);
+	return QPoint();
+}
+
+void RKQWebView::setScrollPosition(const QPoint &pos, bool wait_for_load) {
+	RK_TRACE(APP);
+}
+
+bool RKQWebView::supportsContentType(const QString &mimename) {
+	RK_TRACE(APP);
+	return true;
+}
+
+void RKQWebView::zoomIn() {
+	RK_TRACE(APP);
+}
+
+void RKQWebView::zoomOut() {
+	RK_TRACE(APP);
+}
diff --git a/rkward/windows/rkqwebview.h b/rkward/windows/rkqwebview.h
new file mode 100644
index 000000000..078bed461
--- /dev/null
+++ b/rkward/windows/rkqwebview.h
@@ -0,0 +1,43 @@
+/*
+rkqwebview - This file is part of the RKWard project. Created: Sun Feb 08 2026
+SPDX-FileCopyrightText: 2026 by Thomas Friedrichsmeier <thomas.friedrichsmeier at kdemail.net>
+SPDX-FileContributor: The RKWard Team <rkward at kde.org>
+SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#ifndef RKQWEBVIEW_H
+#define RKQWEBVIEW_H
+
+#include <QPointer>
+
+#include "rkhtmlviewer.h"
+
+class QQuickWidget;
+
+class RKQWebView : public RKHTMLViewer {
+  public:
+	QWidget *createWidget(QWidget *parent) override;
+	QUrl url() const override;
+	void load(const QUrl &url) override;
+	void print() override;
+	void installPersistentJS(const QString &script, const QString &id) override;
+	void runJS(const QString &script, std::function<void(const QVariant &)> callback) override;
+	void setHTML(const QString &html, const QUrl &url) override;
+	bool installHelpProtocolHandler() override;
+	void findRequest(const QString &text, bool backwards, RKFindBar *findbar, bool *found) override;
+	QMenu *createContextMenu(const QPoint &clickpos) override;
+	QString selectedText() const override;
+	void exportPage() override;
+	QPoint scrollPosition() const override;
+	void setScrollPosition(const QPoint &pos, bool wait_for_load) override;
+	bool supportsContentType(const QString &mimename) override;
+	void zoomIn() override;
+	void zoomOut() override;
+
+  private:
+	friend class RKHTMLViewer;
+	RKQWebView(RKHTMLWindow *parent);
+	QPointer<QQuickWidget> view;
+};
+
+#endif
diff --git a/rkward/windows/rkqwebview.qml b/rkward/windows/rkqwebview.qml
new file mode 100644
index 000000000..761a1ea7e
--- /dev/null
+++ b/rkward/windows/rkqwebview.qml
@@ -0,0 +1,22 @@
+// rkqwebview - This file is part of the RKWard project. Created: Sun Feb 08 2026
+// SPDX-FileCopyrightText: 2026 by Thomas Friedrichsmeier <thomas.friedrichsmeier at kdemail.net>
+// SPDX-FileContributor: The RKWard Team <rkward at kde.org>
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+import QtQuick
+import QtQuick.Controls
+import QtWebView
+import QtQuick.Layouts
+
+Item {
+        id: frame
+        visible: true
+
+        WebView {
+                id: webView
+                objectName: "webView"
+                visible: true
+                width: parent.width
+                height: parent.height
+        }
+}



More information about the rkward-tracker mailing list