Heute ist der 20. Juli 2026. Liebe Leserinnen und Leser, hallo du. Diese Webseite ist
für mich ein „Meilenstein“Nach so langer Zeit habe ich es
endlich geschafft, einen „Code Viewer“in meine Webseite
zu integrieren. Er ist ausgerüstet mit Download- und Kopierfunktion. Weiterhin verfügt
er über eine Zeilennummer, damit man spezielle Syntax besser beschreiben kann. Python,
C++ und JavaScript kann dieser Code-Viewer verarbeiten. Mehrere Code-Viewer-Module
kann die Webseite aufnehmen und vollkommen autark voneinander verarbeiten. Dabei werden
nur HTML-Parameter verändert. CSS und JavaScript passen sich automatisch an. Die
Programmierung, und Umsetzung waren schon eine richtige „Nummer“, das kann ich dir sagen.
Ab jetzt haben alle meine Webseiten, die sich mit der Dokumentation von Programmierung
auseinandersetzen, ein JavaScript Modul. Wenn du mich für einen unsicheren Kantonisten
hältst, verlasse diese Webseite. Alle Informationen, verbunden mit der Bereitstellung
des Quellencodes, sind ohne Gewähr.
Es geht weiter mit der Baureihe: PyQt6. Dieser Teil 5 behandelt einen Browser. Zwei
Applikationen stelle ich hier vor: mit und ohne Privatmodus. Wichtig zu wissen!
Der Privatmodus schützt dich nur lokal auf deinem Rechner – er verbirgt nicht deine
IP-Adresse und macht dich nicht unsichtbar für Webseiten, deinen Internetanbieter
oder deinen Arbeitgeber/Netzwerkbetreiber. Er sorgt lediglich dafür, dass der
Browser selbst nichts speichert.
Was drin ist:
🔷 Mehrere Tabs (öffnen, schließen, per Drag umsortieren).
🔷 Adressleiste: erkennt URLs automatisch oder startet bei einfachem Text eine Google-Suche.
🔷 Zurück/Vor/Neu laden/Startseite-Buttons.
🔷 Ladefortschrittsanzeige in der Statusleiste.
🔷 Tab-Titel und Favicons werden automatisch aktualisiert.
🔷 Links mit target="_blank" öffnen sauber einen neuen Tab statt eines Extra-Fensters.
🔷 Tastenkürzel: Strg+T neuer Tab, Strg+W Tab schließen, Strg+L Adressleiste fokussieren, F5 neu laden.
#!/usr/bin/env python3
# *****************************************************************************
# Ein interaktiver Webbrowser mit PyQt6. Die komplette Oberfläche wird per
# Code erzeugt (kein Qt Designer / .ui-Datei).
# Installation der Abhängigkeit: pip install PyQt6 PyQt6-WebEngine
# Wenn Versionsprobleme dann:
# pip install --upgrade --force-reinstall PyQt6 PyQt6-WebEngine
# Start: python pyqt6_browser.py (c) Hans Busche Datum: 20.07.2026
# *****************************************************************************
import sys
from PyQt6.QtCore import QUrl, Qt
from PyQt6.QtGui import QAction, QIcon, QKeySequence
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QToolBar,
QLineEdit,
QTabWidget,
QStatusBar,
QProgressBar,
QMenu,
QWidget,
QVBoxLayout,
)
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtWebEngineCore import QWebEnginePage
HOME_URL = "https://www.google.com"
class BrowserTab(QWebEngineView):
"""Ein einzelner Tab-Inhalt (die eigentliche Webseite)."""
def __init__(self, url: str = HOME_URL, parent=None):
super().__init__(parent)
self.setUrl(QUrl(url))
def createWindow(self, _type):
"""Sorgt dafür, dass target="_blank"-Links in einem neuen Tab statt
in einem separaten Fenster geöffnet werden."""
main_window = self.window()
if isinstance(main_window, BrowserWindow):
return main_window.add_new_tab(QUrl(HOME_URL), "Neuer Tab").page()
return None
class BrowserWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Mein PyQt6 Browser")
self.resize(1200, 800)
# ---------- Tab-Widget als zentrales Element ----------
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.setMovable(True)
self.tabs.tabCloseRequested.connect(self.close_tab)
self.tabs.currentChanged.connect(self.current_tab_changed)
self.setCentralWidget(self.tabs)
# ---------- Navigations-Toolbar ----------
self._build_toolbar()
# ---------- Statusleiste mit Ladebalken ----------
self.status = QStatusBar()
self.setStatusBar(self.status)
self.progress_bar = QProgressBar()
self.progress_bar.setMaximumWidth(150)
self.progress_bar.setTextVisible(False)
self.progress_bar.hide()
self.status.addPermanentWidget(self.progress_bar)
# ---------- Ersten Tab öffnen ----------
self.add_new_tab(QUrl(HOME_URL), "Startseite")
# ---------- Tastenkürzel ----------
self._build_shortcuts()
# *****************************************************************************
# Aufbau der Oberfläche
# *****************************************************************************
def _build_toolbar(self):
toolbar = QToolBar("Navigation")
toolbar.setMovable(False)
toolbar.setIconSize(toolbar.iconSize())
self.addToolBar(toolbar)
back_action = QAction("◀", self)
back_action.setToolTip("Zurück")
back_action.triggered.connect(lambda: self.current_view().back())
toolbar.addAction(back_action)
forward_action = QAction("▶", self)
forward_action.setToolTip("Vorwärts")
forward_action.triggered.connect(lambda: self.current_view().forward())
toolbar.addAction(forward_action)
reload_action = QAction("⟳", self)
reload_action.setToolTip("Neu laden")
reload_action.triggered.connect(lambda: self.current_view().reload())
toolbar.addAction(reload_action)
home_action = QAction("⌂", self)
home_action.setToolTip("Startseite")
home_action.triggered.connect(self.go_home)
toolbar.addAction(home_action)
toolbar.addSeparator()
# Adressleiste
self.address_bar = QLineEdit()
self.address_bar.setPlaceholderText("URL eingeben oder suchen …")
self.address_bar.returnPressed.connect(self.load_from_address_bar)
toolbar.addWidget(self.address_bar)
new_tab_action = QAction("+", self)
new_tab_action.setToolTip("Neuer Tab")
new_tab_action.triggered.connect(lambda: self.add_new_tab(QUrl(HOME_URL), "Neuer Tab"))
toolbar.addAction(new_tab_action)
def _build_shortcuts(self):
new_tab_sc = QAction(self)
new_tab_sc.setShortcut(QKeySequence("Ctrl+T"))
new_tab_sc.triggered.connect(lambda: self.add_new_tab(QUrl(HOME_URL), "Neuer Tab"))
self.addAction(new_tab_sc)
close_tab_sc = QAction(self)
close_tab_sc.setShortcut(QKeySequence("Ctrl+W"))
close_tab_sc.triggered.connect(lambda: self.close_tab(self.tabs.currentIndex()))
self.addAction(close_tab_sc)
focus_address_sc = QAction(self)
focus_address_sc.setShortcut(QKeySequence("Ctrl+L"))
focus_address_sc.triggered.connect(lambda: self.address_bar.setFocus())
self.addAction(focus_address_sc)
reload_sc = QAction(self)
reload_sc.setShortcut(QKeySequence("F5"))
reload_sc.triggered.connect(lambda: self.current_view().reload())
self.addAction(reload_sc)
# ------------------------------------------------------------------
# Tab-Verwaltung
# ------------------------------------------------------------------
def add_new_tab(self, url: QUrl, label: str = "Neuer Tab") -> BrowserTab:
view = BrowserTab(url.toString())
index = self.tabs.addTab(view, label)
self.tabs.setCurrentIndex(index)
view.urlChanged.connect(lambda qurl, v=view: self.update_url_for_view(qurl, v))
view.titleChanged.connect(lambda title, v=view: self.update_tab_title(title, v))
view.loadStarted.connect(lambda: self.on_load_started())
view.loadProgress.connect(self.on_load_progress)
view.loadFinished.connect(lambda ok, v=view: self.on_load_finished(ok, v))
view.iconChanged.connect(lambda icon, v=view: self.update_tab_icon(icon, v))
return view
def close_tab(self, index: int):
if self.tabs.count() < 2:
self.close()
return
widget = self.tabs.widget(index)
widget.deleteLater()
self.tabs.removeTab(index)
def current_view(self) -> BrowserTab:
return self.tabs.currentWidget()
def current_tab_changed(self, index: int):
if index == -1:
return
view = self.tabs.widget(index)
self.address_bar.setText(view.url().toString())
# ------------------------------------------------------------------
# Navigation / Adressleiste
# ------------------------------------------------------------------
def load_from_address_bar(self):
text = self.address_bar.text().strip()
if not text:
return
url = QUrl.fromUserInput(text)
# Wenn keine gültige URL erkannt wird, als Google-Suche behandeln
if not url.isValid() or ("." not in text and not text.startswith("http")):
url = QUrl(f"https://www.google.com/search?q={text}")
self.current_view().setUrl(url)
def go_home(self):
self.current_view().setUrl(QUrl(HOME_URL))
def update_url_for_view(self, qurl: QUrl, view: BrowserTab):
if view == self.current_view():
self.address_bar.setText(qurl.toString())
self.address_bar.setCursorPosition(0)
def update_tab_title(self, title: str, view: BrowserTab):
index = self.tabs.indexOf(view)
if index != -1:
short_title = title if len(title) <= 20 else title[:17] + "…"
self.tabs.setTabText(index, short_title or "Neuer Tab")
if view == self.current_view():
self.setWindowTitle(f"{title} – Mein PyQt6 Browser")
def update_tab_icon(self, icon, view: BrowserTab):
index = self.tabs.indexOf(view)
if index != -1:
self.tabs.setTabIcon(index, icon)
# ------------------------------------------------------------------
# Ladefortschritt / Status
# ------------------------------------------------------------------
def on_load_started(self):
self.progress_bar.setValue(0)
self.progress_bar.show()
def on_load_progress(self, value: int):
self.progress_bar.setValue(value)
def on_load_finished(self, ok: bool, view: BrowserTab):
self.progress_bar.hide()
if view == self.current_view():
self.status.showMessage("Fertig geladen" if ok else "Laden fehlgeschlagen", 3000)
# *****************************************************************************
# main
# *****************************************************************************
def main():
app = QApplication(sys.argv)
app.setApplicationName("Mein PyQt6 Browser")
window = BrowserWindow()
window.show()
sys.exit(app.exec())
if __name__ == "__main__":
main()
# *****************************************************************************
# Ende
# *****************************************************************************
Das Programm einfach erklärt. Stell dir den Browser wie ein Haus mit mehreren Räumen vor:
🔷 Zeile 44: BrowserWindow ist das ganze Haus – das Fenster, das du siehst, mit Adressleiste,
Buttons und Tabs.
🔷 Zeile 31: BrowserTab ist ein einzelner Raum darin – jeder Tab zeigt eine Webseite an.
Du kannst beliebig viele Räume (Tabs) öffnen und wieder schließen.
🔷 Zeile 31: QWebEngineView ist quasi der "Fernseher" in jedem Raum – das Bauteil, das
tatsächlich Webseiten darstellen kann (basiert auf demselben Chromium-Motor wie Google Chrome).
🔷 Zeile 74: Die Toolbar (_build_toolbar) baut die Knopfleiste oben: Zurück, Vor, Neu laden, Startseite,
Adressfeld, neuer Tab, privates Fenster.
🔷 Zeile 53,54,81,85,89,93.....: Signale/Slots (z. B. urlChanged.connect(...)): Das ist Qt's Art zu sagen
"wenn X passiert, führe Y aus" – z. B. "wenn sich die URL ändert, aktualisiere die Adressleiste".
🔷 Zeile 207: main() ist der Startschalter: Er erstellt die Qt-Anwendung, zeigt das erste Fenster und
hält alles am Laufen, bis du es schließt.
Das Profil (QWebEngineProfile) ist wie das "Gedächtnis" des Browsers: Es merkt sich Cookies und Verlauf.
Im normalen Modus ist das dauerhaft, im privaten Modus ein Wegwerf-Gedächtnis, das nach Schließen
gelöscht wird. Kurz gesagt: Ein Fenster verwaltet mehrere Tabs, jeder Tab zeigt eine Webseite, und über
Knöpfe/Tastenkürzel steuerst du, was passiert (neue Seite laden, neuer Tab, privates Fenster öffnen).
Wie baut man unter PyQt6 ein Fenster?
Ein Fenster in PyQt6 ohne den Qt-Designer zu erstellen, erfolgt am besten objektorientiert
durch das Ableiten von QMainWindow oder QWidget. Du definierst Widgets und Layouts im
Code, was dir volle Kontrolle über das Verhalten und die Skalierbarkeit der Anwendung gibt.
Der typische Arbeitsablauf.
🔷 Applikation initialisieren: Du erstellst eine Instanz von QApplication.
🔷 Hauptfenster definieren: Du erstellst eine Klasse, die von QMainWindow erbt.
🔷 Zentrales Widget erstellen: Da QMainWindow spezifische Bereiche (wie Menüleisten)
hat, definierst du ein Qwidget als zentrale Arbeitsfläche und weist dieses dem
Hauptfenster zu.
🔷 Widgets & Layouts anlegen: Du erstellst GUI-Elemente (z. B. QPushButton,
QLabel, QLineEdit) und ordnest diese in Layouts an (QHBoxLayout, QVBoxLayout,
QGridLayout).
🔷 Applikation starten: Rufe die .show()-Methode auf und starte die Ereignisschleife exec().
Zurück zum Thema: 🕵 Privater Modus!
Ein eigenes, separates Fenster, das du über den 🕵-Button oder Strg+Umschalt+N öffnest. Speichert nichts
dauerhaft: Cookies, Verlauf und Cache existieren nur im Arbeitsspeicher, solange das Fenster offen ist.
Nutzt ein eigenes "off-the-record"-Profil – komplett getrennt vom normalen Profil und von jedem weiteren
privaten Fenster. Titel: „🕵 Seitentitel – Privates Fenster". Beim Öffnen zeigt die Statusleiste
kurz „🕵 Privater Modus aktiv".
Alles verschwindet, sobald du das private Fenster schließt – als wäre nichts gewesen
Gedacht für Surfen, das keine Spuren auf dem Rechner hinterlassen soll (z. B. Geschenke online
recherchieren, fremder Account testen).
#!/usr/bin/env python3
# *****************************************************************************
# Privat Modus!
# Ein interaktiver Webbrowser mit PyQt6. Die komplette Oberfläche wird per
# Code erzeugt (kein Qt Designer / .ui-Datei).
# Installation der Abhängigkeit: pip install PyQt6 PyQt6-WebEngine
# Wenn Versionsprobleme dann:
# pip install --upgrade --force-reinstall PyQt6 PyQt6-WebEngine
# Start: python pyqt6_private_browser.py (c) Hans Busche Datum: 22.07.2026
# *****************************************************************************
import sys
from PyQt6.QtCore import QUrl, Qt
from PyQt6.QtGui import QAction, QIcon, QKeySequence
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QToolBar,
QLineEdit,
QTabWidget,
QStatusBar,
QProgressBar,
QMenu,
QWidget,
QVBoxLayout,
)
try:
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtWebEngineCore import QWebEngineProfile, QWebEnginePage
except ModuleNotFoundError as exc:
sys.exit(
"Fehler: Das Paket 'PyQt6-WebEngine' fehlt.\n"
"Bitte installieren mit:\n"
" pip install PyQt6 PyQt6-WebEngine\n"
f"(Original-Fehler: {exc})"
)
HOME_URL = "https://www.google.com"
# Hält Referenzen auf offene private Fenster, damit Python sie nicht
# vorzeitig "wegräumt" (Garbage Collection), solange sie geöffnet sind.
_child_windows = []
class BrowserTab(QWebEngineView):
"""Ein einzelner Tab-Inhalt (die eigentliche Webseite)."""
def __init__(self, url: str = HOME_URL, parent=None, profile: QWebEngineProfile = None):
super().__init__(parent)
if profile is not None:
# Eigene Page mit dem übergebenen Profil verwenden (z. B. privates Profil)
page = QWebEnginePage(profile, self)
self.setPage(page)
self.setUrl(QUrl(url))
def createWindow(self, _type):
"""Sorgt dafür, dass target="_blank"-Links in einem neuen Tab statt
in einem separaten Fenster geöffnet werden."""
main_window = self.window()
if isinstance(main_window, BrowserWindow):
return main_window.add_new_tab(QUrl(HOME_URL), "Neuer Tab").page()
return None
class BrowserWindow(QMainWindow):
def __init__(self, is_private: bool = False):
super().__init__()
self.is_private = is_private
# ---------- Profil festlegen ----------
if self.is_private:
# QWebEngineProfile() OHNE Namen = "off-the-record"-Profil:
# Cookies, Verlauf & Cache landen nur im Arbeitsspeicher und
# sind weg, sobald dieses Fenster geschlossen wird.
self.profile = QWebEngineProfile(self)
self.setWindowTitle("🕵 Privates Fenster – Mein PyQt6 Browser")
else:
# Das normale, dauerhafte Standard-Profil (speichert Cookies/Verlauf).
self.profile = QWebEngineProfile.defaultProfile()
self.setWindowTitle("Mein PyQt6 Browser")
self.resize(1200, 800)
# ---------- Tab-Widget als zentrales Element ----------
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tabs.setMovable(True)
self.tabs.tabCloseRequested.connect(self.close_tab)
self.tabs.currentChanged.connect(self.current_tab_changed)
self.setCentralWidget(self.tabs)
# ---------- Navigations-Toolbar ----------
self._build_toolbar()
# ---------- Statusleiste mit Ladebalken ----------
self.status = QStatusBar()
self.setStatusBar(self.status)
self.progress_bar = QProgressBar()
self.progress_bar.setMaximumWidth(150)
self.progress_bar.setTextVisible(False)
self.progress_bar.hide()
self.status.addPermanentWidget(self.progress_bar)
if self.is_private:
# Deutlich sichtbarer Hinweis, dass gerade privat gesurft wird
self.status.showMessage("🕵 Privater Modus aktiv – Verlauf wird nicht gespeichert", 5000)
self.setStyleSheet("QMainWindow { background-color: #2b2b2b; }")
# ---------- Ersten Tab öffnen ----------
self.add_new_tab(QUrl(HOME_URL), "Startseite")
# ---------- Tastenkürzel ----------
self._build_shortcuts()
# ------------------------------------------------------------------
# Aufbau der Oberfläche
# ------------------------------------------------------------------
def _build_toolbar(self):
toolbar = QToolBar("Navigation")
toolbar.setMovable(False)
toolbar.setIconSize(toolbar.iconSize())
self.addToolBar(toolbar)
back_action = QAction("◀", self)
back_action.setToolTip("Zurück")
back_action.triggered.connect(lambda: self.current_view().back())
toolbar.addAction(back_action)
forward_action = QAction("▶", self)
forward_action.setToolTip("Vorwärts")
forward_action.triggered.connect(lambda: self.current_view().forward())
toolbar.addAction(forward_action)
reload_action = QAction("⟳", self)
reload_action.setToolTip("Neu laden")
reload_action.triggered.connect(lambda: self.current_view().reload())
toolbar.addAction(reload_action)
home_action = QAction("⌂", self)
home_action.setToolTip("Startseite")
home_action.triggered.connect(self.go_home)
toolbar.addAction(home_action)
toolbar.addSeparator()
# Adressleiste
self.address_bar = QLineEdit()
self.address_bar.setPlaceholderText("URL eingeben oder suchen …")
self.address_bar.returnPressed.connect(self.load_from_address_bar)
toolbar.addWidget(self.address_bar)
new_tab_action = QAction("+", self)
new_tab_action.setToolTip("Neuer Tab")
new_tab_action.triggered.connect(lambda: self.add_new_tab(QUrl(HOME_URL), "Neuer Tab"))
toolbar.addAction(new_tab_action)
toolbar.addSeparator()
private_action = QAction("🕵", self)
private_action.setToolTip("Neues privates Fenster (Strg+Umschalt+N)")
private_action.triggered.connect(self.open_private_window)
toolbar.addAction(private_action)
def _build_shortcuts(self):
new_tab_sc = QAction(self)
new_tab_sc.setShortcut(QKeySequence("Ctrl+T"))
new_tab_sc.triggered.connect(lambda: self.add_new_tab(QUrl(HOME_URL), "Neuer Tab"))
self.addAction(new_tab_sc)
close_tab_sc = QAction(self)
close_tab_sc.setShortcut(QKeySequence("Ctrl+W"))
close_tab_sc.triggered.connect(lambda: self.close_tab(self.tabs.currentIndex()))
self.addAction(close_tab_sc)
focus_address_sc = QAction(self)
focus_address_sc.setShortcut(QKeySequence("Ctrl+L"))
focus_address_sc.triggered.connect(lambda: self.address_bar.setFocus())
self.addAction(focus_address_sc)
reload_sc = QAction(self)
reload_sc.setShortcut(QKeySequence("F5"))
reload_sc.triggered.connect(lambda: self.current_view().reload())
self.addAction(reload_sc)
private_sc = QAction(self)
private_sc.setShortcut(QKeySequence("Ctrl+Shift+N"))
private_sc.triggered.connect(self.open_private_window)
self.addAction(private_sc)
# ------------------------------------------------------------------
# Tab-Verwaltung
# ------------------------------------------------------------------
def add_new_tab(self, url: QUrl, label: str = "Neuer Tab") -> BrowserTab:
view = BrowserTab(url.toString(), profile=self.profile)
index = self.tabs.addTab(view, label)
self.tabs.setCurrentIndex(index)
view.urlChanged.connect(lambda qurl, v=view: self.update_url_for_view(qurl, v))
view.titleChanged.connect(lambda title, v=view: self.update_tab_title(title, v))
view.loadStarted.connect(lambda: self.on_load_started())
view.loadProgress.connect(self.on_load_progress)
view.loadFinished.connect(lambda ok, v=view: self.on_load_finished(ok, v))
view.iconChanged.connect(lambda icon, v=view: self.update_tab_icon(icon, v))
return view
def open_private_window(self):
"""Öffnet ein komplett neues Fenster mit eigenem, nicht-persistentem Profil."""
private_window = BrowserWindow(is_private=True)
private_window.show()
# Referenz merken, damit Python das Fenster nicht vorzeitig entsorgt
_child_windows.append(private_window)
def close_tab(self, index: int):
if self.tabs.count() < 2:
self.close()
return
widget = self.tabs.widget(index)
widget.deleteLater()
self.tabs.removeTab(index)
def current_view(self) -> BrowserTab:
return self.tabs.currentWidget()
def current_tab_changed(self, index: int):
if index == -1:
return
view = self.tabs.widget(index)
self.address_bar.setText(view.url().toString())
# ------------------------------------------------------------------
# Navigation / Adressleiste
# ------------------------------------------------------------------
def load_from_address_bar(self):
text = self.address_bar.text().strip()
if not text:
return
url = QUrl.fromUserInput(text)
# Wenn keine gültige URL erkannt wird, als Google-Suche behandeln
if not url.isValid() or ("." not in text and not text.startswith("http")):
url = QUrl(f"https://www.google.com/search?q={text}")
self.current_view().setUrl(url)
def go_home(self):
self.current_view().setUrl(QUrl(HOME_URL))
def update_url_for_view(self, qurl: QUrl, view: BrowserTab):
if view == self.current_view():
self.address_bar.setText(qurl.toString())
self.address_bar.setCursorPosition(0)
def update_tab_title(self, title: str, view: BrowserTab):
index = self.tabs.indexOf(view)
if index != -1:
short_title = title if len(title) <= 20 else title[:17] + "…"
self.tabs.setTabText(index, short_title or "Neuer Tab")
if view == self.current_view():
suffix = "🕵 Privates Fenster" if self.is_private else "Mein PyQt6 Browser"
self.setWindowTitle(f"{title} – {suffix}")
def update_tab_icon(self, icon, view: BrowserTab):
index = self.tabs.indexOf(view)
if index != -1:
self.tabs.setTabIcon(index, icon)
# ------------------------------------------------------------------
# Ladefortschritt / Status
# ------------------------------------------------------------------
def on_load_started(self):
self.progress_bar.setValue(0)
self.progress_bar.show()
def on_load_progress(self, value: int):
self.progress_bar.setValue(value)
def on_load_finished(self, ok: bool, view: BrowserTab):
self.progress_bar.hide()
if view == self.current_view():
self.status.showMessage("Fertig geladen" if ok else "Laden fehlgeschlagen", 3000)
def main():
app = QApplication(sys.argv)
app.setApplicationName("Mein PyQt6 Browser")
window = BrowserWindow()
window.show()
sys.exit(app.exec())
if __name__ == "__main__":
main()
Das Profil (QWebEngineProfile) ist wie das "Gedächtnis" des Browsers: Es merkt sich Cookies und Verlauf.
Im normalen Modus ist das dauerhaft, im privaten Modus ein Wegwerf-Gedächtnis, das nach Schließen
gelöscht wird. Kurz gesagt: Ein Fenster verwaltet mehrere Tabs, jeder Tab zeigt eine Webseite, und über
Knöpfe/Tastenkürzel steuerst du, was passiert (neue Seite laden, neuer Tab, privates Fenster öffnen).
PyQt6 Browser. Ohne Gewähr © 2026 Hans Busche