aboutsummaryrefslogtreecommitdiffstats
path: root/examples/webenginewidgets/tabbedbrowser/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/webenginewidgets/tabbedbrowser/main.py')
-rw-r--r--examples/webenginewidgets/tabbedbrowser/main.py382
1 files changed, 382 insertions, 0 deletions
diff --git a/examples/webenginewidgets/tabbedbrowser/main.py b/examples/webenginewidgets/tabbedbrowser/main.py
new file mode 100644
index 000000000..c46d95b07
--- /dev/null
+++ b/examples/webenginewidgets/tabbedbrowser/main.py
@@ -0,0 +1,382 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide2 WebEngineWidgets Example"""
+
+import sys
+from bookmarkwidget import BookmarkWidget
+from browsertabwidget import BrowserTabWidget
+from downloadwidget import DownloadWidget
+from findtoolbar import FindToolBar
+from webengineview import QWebEnginePage, WebEngineView
+from PySide2 import QtCore
+from PySide2.QtCore import Qt, QUrl
+from PySide2.QtGui import QCloseEvent, QKeySequence, QIcon
+from PySide2.QtWidgets import (qApp, QAction, QApplication, QDesktopWidget,
+ QDockWidget, QLabel, QLineEdit, QMainWindow, QMenu, QMenuBar, QPushButton,
+ QStatusBar, QToolBar)
+from PySide2.QtWebEngineWidgets import (QWebEngineDownloadItem, QWebEnginePage,
+ QWebEngineView)
+
+mainWindows = []
+
+def createMainWindow():
+ mainWin = MainWindow()
+ mainWindows.append(mainWin)
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ mainWin.resize(availableGeometry.width() * 2 / 3, availableGeometry.height() * 2 / 3)
+ mainWin.show()
+ return mainWin
+
+def createMainWindowWithBrowser():
+ mainWin = createMainWindow()
+ return mainWin.addBrowserTab()
+
+class MainWindow(QMainWindow):
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.setWindowTitle('PySide2 Tabbed Browser Example')
+
+ self._tabWidget = BrowserTabWidget(createMainWindowWithBrowser)
+ self._tabWidget.enabledChanged.connect(self._enabledChanged)
+ self._tabWidget.downloadRequested.connect(self._downloadRequested)
+ self.setCentralWidget(self._tabWidget)
+ self.connect(self._tabWidget, QtCore.SIGNAL("urlChanged(QUrl)"),
+ self.urlChanged)
+
+ self._bookmarkDock = QDockWidget()
+ self._bookmarkDock.setWindowTitle('Bookmarks')
+ self._bookmarkWidget = BookmarkWidget()
+ self._bookmarkWidget.openBookmark.connect(self.loadUrl)
+ self._bookmarkWidget.openBookmarkInNewTab.connect(self.loadUrlInNewTab)
+ self._bookmarkDock.setWidget(self._bookmarkWidget)
+ self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmarkDock)
+
+ self._findToolBar = None
+
+ self._actions = {}
+ self._createMenu()
+
+ self._toolBar = QToolBar()
+ self.addToolBar(self._toolBar)
+ for action in self._actions.values():
+ if not action.icon().isNull():
+ self._toolBar.addAction(action)
+
+ self._addressLineEdit = QLineEdit()
+ self._addressLineEdit.setClearButtonEnabled(True)
+ self._addressLineEdit.returnPressed.connect(self.load)
+ self._toolBar.addWidget(self._addressLineEdit)
+ self._zoomLabel = QLabel()
+ self.statusBar().addPermanentWidget(self._zoomLabel)
+ self._updateZoomLabel()
+
+ self._bookmarksToolBar = QToolBar()
+ self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar)
+ self.insertToolBarBreak(self._bookmarksToolBar)
+ self._bookmarkWidget.changed.connect(self._updateBookmarks)
+ self._updateBookmarks()
+
+ def _updateBookmarks(self):
+ self._bookmarkWidget.populateToolBar(self._bookmarksToolBar)
+ self._bookmarkWidget.populateOther(self._bookmarkMenu, 3)
+
+ def _createMenu(self):
+ fileMenu = self.menuBar().addMenu("&File")
+ exitAction = QAction(QIcon.fromTheme("application-exit"), "E&xit",
+ self, shortcut = "Ctrl+Q", triggered=qApp.quit)
+ fileMenu.addAction(exitAction)
+
+ navigationMenu = self.menuBar().addMenu("&Navigation")
+
+ styleIcons = ':/qt-project.org/styles/commonstyle/images/'
+ backAction = QAction(QIcon.fromTheme("go-previous",
+ QIcon(styleIcons + 'left-32.png')),
+ "Back", self,
+ shortcut = QKeySequence(QKeySequence.Back),
+ triggered = self._tabWidget.back)
+ self._actions[QWebEnginePage.Back] = backAction
+ backAction.setEnabled(False)
+ navigationMenu.addAction(backAction)
+ forwardAction = QAction(QIcon.fromTheme("go-next",
+ QIcon(styleIcons + 'right-32.png')),
+ "Forward", self,
+ shortcut = QKeySequence(QKeySequence.Forward),
+ triggered = self._tabWidget.forward)
+ forwardAction.setEnabled(False)
+ self._actions[QWebEnginePage.Forward] = forwardAction
+
+ navigationMenu.addAction(forwardAction)
+ reloadAction = QAction(QIcon(styleIcons + 'refresh-32.png'),
+ "Reload", self,
+ shortcut = QKeySequence(QKeySequence.Refresh),
+ triggered = self._tabWidget.reload)
+ self._actions[QWebEnginePage.Reload] = reloadAction
+ reloadAction.setEnabled(False)
+ navigationMenu.addAction(reloadAction)
+
+ navigationMenu.addSeparator()
+
+ newTabAction = QAction("New Tab", self,
+ shortcut = 'Ctrl+T',
+ triggered = self.addBrowserTab)
+ navigationMenu.addAction(newTabAction)
+
+ closeTabAction = QAction("Close Current Tab", self,
+ shortcut = "Ctrl+W",
+ triggered = self._closeCurrentTab)
+ navigationMenu.addAction(closeTabAction)
+
+ editMenu = self.menuBar().addMenu("&Edit")
+
+ findAction = QAction("Find", self,
+ shortcut = QKeySequence(QKeySequence.Find),
+ triggered = self._showFind)
+ editMenu.addAction(findAction)
+
+ editMenu.addSeparator()
+ undoAction = QAction("Undo", self,
+ shortcut = QKeySequence(QKeySequence.Undo),
+ triggered = self._tabWidget.undo)
+ self._actions[QWebEnginePage.Undo] = undoAction
+ undoAction.setEnabled(False)
+ editMenu.addAction(undoAction)
+
+ redoAction = QAction("Redo", self,
+ shortcut = QKeySequence(QKeySequence.Redo),
+ triggered = self._tabWidget.redo)
+ self._actions[QWebEnginePage.Redo] = redoAction
+ redoAction.setEnabled(False)
+ editMenu.addAction(redoAction)
+
+ editMenu.addSeparator()
+
+ cutAction = QAction("Cut", self,
+ shortcut = QKeySequence(QKeySequence.Cut),
+ triggered = self._tabWidget.cut)
+ self._actions[QWebEnginePage.Cut] = cutAction
+ cutAction.setEnabled(False)
+ editMenu.addAction(cutAction)
+
+ copyAction = QAction("Copy", self,
+ shortcut = QKeySequence(QKeySequence.Copy),
+ triggered = self._tabWidget.copy)
+ self._actions[QWebEnginePage.Copy] = copyAction
+ copyAction.setEnabled(False)
+ editMenu.addAction(copyAction)
+
+ pasteAction = QAction("Paste", self,
+ shortcut = QKeySequence(QKeySequence.Paste),
+ triggered = self._tabWidget.paste)
+ self._actions[QWebEnginePage.Paste] = pasteAction
+ pasteAction.setEnabled(False)
+ editMenu.addAction(pasteAction)
+
+ editMenu.addSeparator()
+
+ selectAllAction = QAction("Select All", self,
+ shortcut = QKeySequence(QKeySequence.SelectAll),
+ triggered = self._tabWidget.selectAll)
+ self._actions[QWebEnginePage.SelectAll] = selectAllAction
+ selectAllAction.setEnabled(False)
+ editMenu.addAction(selectAllAction)
+
+ self._bookmarkMenu = self.menuBar().addMenu("&Bookmarks")
+ addBookmarkAction = QAction("&Add Bookmark", self,
+ triggered = self._addBookmark)
+ self._bookmarkMenu.addAction(addBookmarkAction)
+ addToolBarBookmarkAction = QAction("&Add Bookmark to Tool Bar", self,
+ triggered = self._addToolBarBookmark)
+ self._bookmarkMenu.addAction(addToolBarBookmarkAction)
+ self._bookmarkMenu.addSeparator()
+
+ toolsMenu = self.menuBar().addMenu("&Tools")
+ downloadAction = QAction("Open Downloads", self,
+ triggered = DownloadWidget.openDownloadDirectory)
+ toolsMenu.addAction(downloadAction)
+
+ windowMenu = self.menuBar().addMenu("&Window")
+
+ windowMenu.addAction(self._bookmarkDock.toggleViewAction())
+
+ windowMenu.addSeparator()
+
+ zoomInAction = QAction(QIcon.fromTheme("zoom-in"),
+ "Zoom In", self,
+ shortcut = QKeySequence(QKeySequence.ZoomIn),
+ triggered = self._zoomIn)
+ windowMenu.addAction(zoomInAction)
+ zoomOutAction = QAction(QIcon.fromTheme("zoom-out"),
+ "Zoom Out", self,
+ shortcut = QKeySequence(QKeySequence.ZoomOut),
+ triggered = self._zoomOut)
+ windowMenu.addAction(zoomOutAction)
+
+ resetZoomAction = QAction(QIcon.fromTheme("zoom-original"),
+ "Reset Zoom", self,
+ shortcut = "Ctrl+0",
+ triggered = self._resetZoom)
+ windowMenu.addAction(resetZoomAction)
+
+ aboutMenu = self.menuBar().addMenu("&About")
+ aboutAction = QAction("About Qt", self,
+ shortcut = QKeySequence(QKeySequence.HelpContents),
+ triggered=qApp.aboutQt)
+ aboutMenu.addAction(aboutAction)
+
+ def addBrowserTab(self):
+ return self._tabWidget.addBrowserTab()
+
+ def _closeCurrentTab(self):
+ if self._tabWidget.count() > 1:
+ self._tabWidget.closeCurrentTab()
+ else:
+ self.close()
+
+ def closeEvent(self, event):
+ mainWindows.remove(self)
+ event.accept()
+
+ def load(self):
+ urlString = self._addressLineEdit.text().strip()
+ if urlString:
+ self.loadUrlString(urlString)
+
+ def loadUrlString(self, urlS):
+ url = QUrl.fromUserInput(urlS)
+ if (url.isValid()):
+ self.loadUrl(url)
+
+ def loadUrl(self, url):
+ self._tabWidget.load(url)
+
+ def loadUrlInNewTab(self, url):
+ self.addBrowserTab().load(url)
+
+ def urlChanged(self, url):
+ self._addressLineEdit.setText(url.toString())
+
+ def _enabledChanged(self, webAction, enabled):
+ action = self._actions[webAction]
+ if action:
+ action.setEnabled(enabled)
+
+ def _addBookmark(self):
+ index = self._tabWidget.currentIndex()
+ if index >= 0:
+ url = self._tabWidget.url()
+ title = self._tabWidget.tabText(index)
+ icon = self._tabWidget.tabIcon(index)
+ self._bookmarkWidget.addBookmark(url, title, icon)
+
+ def _addToolBarBookmark(self):
+ index = self._tabWidget.currentIndex()
+ if index >= 0:
+ url = self._tabWidget.url()
+ title = self._tabWidget.tabText(index)
+ icon = self._tabWidget.tabIcon(index)
+ self._bookmarkWidget.addToolBarBookmark(url, title, icon)
+
+ def _zoomIn(self):
+ newZoom = self._tabWidget.zoomFactor() * 1.5
+ if (newZoom <= WebEngineView.maximumZoomFactor()):
+ self._tabWidget.setZoomFactor(newZoom)
+ self._updateZoomLabel()
+
+ def _zoomOut(self):
+ newZoom = self._tabWidget.zoomFactor() / 1.5
+ if (newZoom >= WebEngineView.minimumZoomFactor()):
+ self._tabWidget.setZoomFactor(newZoom)
+ self._updateZoomLabel()
+
+ def _resetZoom(self):
+ self._tabWidget.setZoomFactor(1)
+ self._updateZoomLabel()
+
+ def _updateZoomLabel(self):
+ percent = int(self._tabWidget.zoomFactor() * 100)
+ self._zoomLabel.setText("{}%".format(percent))
+
+ def _downloadRequested(self, item):
+ # Remove old downloads before opening a new one
+ for oldDownload in self.statusBar().children():
+ if type(oldDownload).__name__ == 'DownloadWidget' and \
+ oldDownload.state() != QWebEngineDownloadItem.DownloadInProgress:
+ self.statusBar().removeWidget(oldDownload)
+ del oldDownload
+
+ item.accept()
+ downloadWidget = DownloadWidget(item)
+ downloadWidget.removeRequested.connect(self._removeDownloadRequested,
+ Qt.QueuedConnection)
+ self.statusBar().addWidget(downloadWidget)
+
+ def _removeDownloadRequested(self):
+ downloadWidget = self.sender()
+ self.statusBar().removeWidget(downloadWidget)
+ del downloadWidget
+
+ def _showFind(self):
+ if self._findToolBar is None:
+ self._findToolBar = FindToolBar()
+ self._findToolBar.find.connect(self._tabWidget.find)
+ self.addToolBar(Qt.BottomToolBarArea, self._findToolBar)
+ else:
+ self._findToolBar.show()
+ self._findToolBar.focusFind()
+
+ def writeBookmarks(self):
+ self._bookmarkWidget.writeBookmarks()
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = createMainWindow()
+ initialUrls = sys.argv[1:]
+ if not initialUrls:
+ initialUrls.append('http://qt.io')
+ for url in initialUrls:
+ mainWin.loadUrlInNewTab(QUrl.fromUserInput(url))
+ exitCode = app.exec_()
+ mainWin.writeBookmarks()
+ sys.exit(exitCode)