PyQt QWebEngineView
last modified August 24, 2023
In this article we show how to work with QWebEngineView.
Sources are available at PyQt-Examples repository. Visit Advanced PyQt5 e-book, read PyQt5 tutorial, or list all PyQt tutorials.
PyQt QWebEngineView
QWebEngineView
is the main widget component of the Qt WebEngine web
browsing module. It is used to display web content. The page
function returns a reference to a web page object.
The QWebEnginePage
provides an object to view and edit web documents.
The qtwebengine
must be installed separately.
$ sudo apt install python3-pyqt5.qtwebengine
This command installs qtwebengine
on a Debian-based Linux.
$ sudo pip install pyqtwebengine
The qtwebengine
installed via pip tool.
PyQt QWebEngineView simple example
The QWebEngineView's
setHtml
sets the content of the
web view to the specified HTML content.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Home page</title> </head> <body> <p> This is a simple HTML page. </p> </body> </html>
We use this simple HTML document to display.
#!/usr/bin/python import sys from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineView class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): vbox = QVBoxLayout(self) self.webEngineView = QWebEngineView() self.loadPage() vbox.addWidget(self.webEngineView) self.setLayout(vbox) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('QWebEngineView') self.show() def loadPage(self): with open('test.html', 'r') as f: html = f.read() self.webEngineView.setHtml(html) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
In the example, we display a simpe HTML document in a PyQt5 application.
self.webEngineView = QWebEngineView()
The QWebEngineView
is created.
def loadPage(self): with open('test.html', 'r') as f: html = f.read() self.webEngineView.setHtml(html)
We open the HTML document and set the content of the document to the web view
with setHtml
.
PyQt QWebEngineView export to PDF
The printToPdf
function exports the web page to PDF file.
#!/usr/bin/python import sys from PyQt5.QtWidgets import (QHBoxLayout, QPushButton, QWidget, QApplication, QVBoxLayout, QMessageBox) from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineView class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): vbox = QVBoxLayout(self) hbox = QHBoxLayout() self.webEngineView = QWebEngineView() self.loadPage() expBtn = QPushButton('Export', self) expBtn.clicked.connect(self.onClicked) hbox.addWidget(expBtn) vbox.addWidget(self.webEngineView) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('QWebEngineView') self.show() def onClicked(self): self.webEngineView.page().printToPdf('myfile.pdf') QMessageBox.information(self, 'info', 'page exported') def loadPage(self): with open('test.html', 'r') as f: html = f.read() self.webEngineView.setHtml(html) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
In the example, we export the current web page to a PDF file and save it in the current working directory.
self.webEngineView.page().printToPdf('myfile.pdf')
We get the reference to the current page with the page
function
and export it and save it with the printToPdf
function.
PyQt QWebEngineView back and forward
In the following example, we implement the back and forward buttons.
The canGoBack
and canGoForward
tell us if there
are prior and subsequent session history entries.
#!/usr/bin/python import sys from PyQt5.QtCore import QUrl from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import (QApplication, QLineEdit, QMainWindow, QPushButton, QToolBar) from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView class Example(QMainWindow): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.toolBar = QToolBar(self) self.addToolBar(self.toolBar) self.backBtn = QPushButton(self) self.backBtn.setEnabled(False) self.backBtn.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png')) self.backBtn.clicked.connect(self.back) self.toolBar.addWidget(self.backBtn) self.forBtn = QPushButton(self) self.forBtn.setEnabled(False) self.forBtn.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png')) self.forBtn.clicked.connect(self.forward) self.toolBar.addWidget(self.forBtn) self.address = QLineEdit(self) self.address.returnPressed.connect(self.load) self.toolBar.addWidget(self.address) self.webEngineView = QWebEngineView(self) self.setCentralWidget(self.webEngineView) self.webEngineView.page().urlChanged.connect(self.onLoadFinished) self.webEngineView.page().titleChanged.connect(self.setWindowTitle) self.webEngineView.page().urlChanged.connect(self.urlChanged) self.setGeometry(300, 300, 500, 400) self.setWindowTitle('QWebEnginePage') self.show() def onLoadFinished(self): if self.webEngineView.history().canGoBack(): self.backBtn.setEnabled(True) else: self.backBtn.setEnabled(False) if self.webEngineView.history().canGoForward(): self.forBtn.setEnabled(True) else: self.forBtn.setEnabled(False) def load(self): url = QUrl.fromUserInput(self.address.text()) if url.isValid(): self.webEngineView.load(url) def back(self): self.webEngineView.page().triggerAction(QWebEnginePage.Back) def forward(self): self.webEngineView.page().triggerAction(QWebEnginePage.Forward) def urlChanged(self, url): self.address.setText(url.toString()) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
We have a toolbar with back and forward buttons. Next to the buttons there is the address bar. A web page is loaded when we enter its address into the address bar.
self.backBtn = QPushButton(self) self.backBtn.setEnabled(False)
At first, there are no items in history; therefore, the buttons are disabled.
self.address = QLineEdit(self) self.address.returnPressed.connect(self.load) self.toolBar.addWidget(self.address)
Upon pressing the Enter/Return key, we load the page in the address bar.
The address bar is a QLineEdit
.
self.webEngineView.page().urlChanged.connect(self.onLoadFinished)
After the page is loaded, we check if there are some items in the history and enable or disable the buttons accordingly.
self.webEngineView.page().titleChanged.connect(self.setWindowTitle)
This line updates the window title to the title of the web page.
self.webEngineView.page().urlChanged.connect(self.urlChanged)
When we go back or forward in history, we make sure that the address bar is updated.
def onLoadFinished(self): if self.webEngineView.history().canGoBack(): self.backBtn.setEnabled(True) else: self.backBtn.setEnabled(False) if self.webEngineView.history().canGoForward(): self.forBtn.setEnabled(True) else: self.forBtn.setEnabled(False)
The onLoadFinished
checks if we can go back or forward in history.
The buttons are enabled/disabled accordingly.
def load(self): url = QUrl.fromUserInput(self.address.text()) if url.isValid(): self.webEngineView.load(url)
In the load
function, we grab the web page from the address bar
and check if the page is a valid URL. If it is valid, the page is loaded
with the QWebEngineView's
load
function.
def back(self): self.webEngineView.page().triggerAction(QWebEnginePage.Back)
To go backward, we trigger the QWebEnginePage.Back
action.
def forward(self): self.webEngineView.page().triggerAction(QWebEnginePage.Forward)
To go forward, we trigger the QWebEnginePage.Forward
action.
In this article we have presented the PyQt QWebEngineView
.
Author
List all PyQt tutorials\.