307 lines
11 KiB
Python
307 lines
11 KiB
Python
# Qweb Indev-20220816
|
|
import os
|
|
import sys
|
|
from PyQt5.QtWidgets import *
|
|
from PyQt5.QtCore import *
|
|
from PyQt5.QtGui import *
|
|
from PyQt5.QtWebEngineWidgets import QWebEngineView
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.setWindowTitle ('Qweb(indev)')
|
|
self.resize(1300, 700)
|
|
self.show()
|
|
|
|
self.tabWidget = QTabWidget()
|
|
self.tabWidget.setTabShape(QTabWidget.Triangular)
|
|
self.tabWidget.setDocumentMode(True)
|
|
self.tabWidget.setMovable(True)
|
|
self.tabWidget.setTabsClosable(True)
|
|
self.tabWidget.tabCloseRequested.connect(self.close_Tab)
|
|
self.setCentralWidget(self.tabWidget)
|
|
|
|
self.webview = WebEngineView (self)
|
|
self.webview.load(QUrl("https://www.google.org"))
|
|
self.create_tab(self.webview)
|
|
|
|
navigation_bar = QToolBar('Navigation')
|
|
|
|
navigation_bar.setIconSize(QSize(16, 16))
|
|
|
|
self.addToolBar(navigation_bar)
|
|
|
|
back_button = QAction(QIcon('images/arrowbackbutton.png'), 'Back', self)
|
|
next_button = QAction(QIcon('images/arrowforwardbutton.png'), 'Forward', self)
|
|
stop_button = QAction(QIcon('images/stopbutton.png'), 'stop', self)
|
|
reload_button = QAction(QIcon('images/arrowreloadbutton.png'), 'reload', self)
|
|
|
|
back_button.triggered.connect(self.webview.back)
|
|
next_button.triggered.connect(self.webview.forward)
|
|
stop_button.triggered.connect(self.webview.stop)
|
|
reload_button.triggered.connect(self.webview.reload)
|
|
|
|
navigation_bar.addAction(back_button)
|
|
navigation_bar.addAction(next_button)
|
|
navigation_bar.addAction(stop_button)
|
|
navigation_bar.addAction(reload_button)
|
|
|
|
self.urlbar = QLineEdit()
|
|
self.urlbar.returnPressed.connect(self.navigate_to_url)
|
|
|
|
navigation_bar.addSeparator()
|
|
navigation_bar.addWidget(self.urlbar)
|
|
|
|
self.webview.urlChanged.connect(self.renew_urlbar)
|
|
|
|
def navigate_to_url(self):
|
|
q = QUrl(self.urlbar.text())
|
|
if q.scheme() == '':
|
|
q.setScheme('http')
|
|
self.webview.setUrl(q)
|
|
|
|
def renew_urlbar(self, q):
|
|
self.urlbar.setText(q.toString())
|
|
self.urlbar.setCursorPosition(0)
|
|
|
|
def create_tab(self, webview):
|
|
self.tab = QWidget()
|
|
self.tabWidget.addTab(self.tab, "Новая страница")
|
|
self.tabWidget.setCurrentWidget(self.tab)
|
|
|
|
self.Layout = QHBoxLayout(self.tab)
|
|
self.Layout.setContentsMargins(0, 0, 0, 0)
|
|
self.Layout.addWidget(webview)
|
|
|
|
def close_Tab(self, index):
|
|
if self.tabWidget.count() > 1:
|
|
self.tabWidget.removeTab(index)
|
|
else:
|
|
self.close ()
|
|
|
|
|
|
class WebEngineView(QWebEngineView):
|
|
|
|
def __init__(self, mainwindow, parent=None):
|
|
super(WebEngineView, self).__init__(parent)
|
|
self.mainwindow = mainwindow
|
|
|
|
def createWindow(self, QWebEnginePage_WebWindowType):
|
|
new_webview = WebEngineView(self.mainwindow)
|
|
self.mainwindow.create_tab(new_webview)
|
|
return new_webview
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication(sys.argv)
|
|
QApplication.setApplicationName('Qweb(indev) - simple browser')
|
|
QApplication.setApplicationVersion('0.0.1')
|
|
browser = MainWindow()
|
|
browser.show()
|
|
sys.exit(app.exec_())
|
|
|
|
|
|
# First other source code (in development)
|
|
'''
|
|
import sys
|
|
import os
|
|
from PyQt5.QtCore import *
|
|
from PyQt5.QtWidgets import *
|
|
from PyQt5.QtGui import *
|
|
from PyQt5.QtWebEngineWidgets import *
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.setWindowTitle("Qweb(indev)")
|
|
self.resize(1300, 700)
|
|
self.show()
|
|
|
|
self.tabs = QTabWidget()
|
|
self.tabs.setTabShape(QTabWidget.Triangular)
|
|
self.tabs.setDocumentMode(True)
|
|
self.tabs.setDocumentMode(True)
|
|
self.tabs.setMovable(True)
|
|
self.tabs.setTabsClosable(True)
|
|
self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
|
|
self.tabs.currentChanged.connect(self.current_tab_changed)
|
|
self.setCentralWidget(self.tabs)
|
|
|
|
self.webview = WebEngineView (self)
|
|
self.webview.load(QUrl("https://www.google.com"))
|
|
|
|
|
|
self.status = QStatusBar()
|
|
self.setStatusBar(self.status)
|
|
|
|
navtb = QToolBar("Navigation")
|
|
navtb.setIconSize(QSize(15,15))
|
|
self.addToolBar(navtb)
|
|
|
|
back_btn = QAction(QIcon(os.path.join('images', 'arrowbackbutton.png')), "Back", self)
|
|
back_btn.setStatusTip("Back to previous page")
|
|
back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())
|
|
navtb.addAction(back_btn)
|
|
|
|
forward_btn = QAction(QIcon(os.path.join('images', 'arrowforwardbutton.png')), "Forward", self)
|
|
forward_btn.setStatusTip("Forward to next page")
|
|
forward_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())
|
|
navtb.addAction(forward_btn)
|
|
|
|
reload_btn = QAction(QIcon(os.path.join('images', 'arrowreloadbutton.png')), "Reload", self)
|
|
reload_btn.setStatusTip("Reload page")
|
|
reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())
|
|
navtb.addAction(reload_btn)
|
|
|
|
home_btn = QAction(QIcon(os.path.join('images', 'homebutton.png')), "Home", self)
|
|
home_btn.setStatusTip("Home page")
|
|
home_btn.triggered.connect(lambda: self.navigate_home)
|
|
navtb.addAction(home_btn)
|
|
|
|
navtb.addSeparator()
|
|
self.httpsicon = QLabel()
|
|
self.httpsicon.setPixmap(QPixmap(os.path.join('images', 'lock-nossl.png')))
|
|
navtb.addWidget(self.httpsicon)
|
|
|
|
self.urlbar = QLineEdit()
|
|
self.urlbar.returnPressed.connect(lambda: self.navigate_to_url)
|
|
navtb.addWidget(self.urlbar)
|
|
|
|
stop_btn = QAction(QIcon(os.path.join('images', 'stopbutton.png')), "Stop", self)
|
|
stop_btn.setStatusTip("Stop loading current page")
|
|
stop_btn.triggered.connect(lambda: self.tabs.currentWidget().stop())
|
|
navtb.addAction(stop_btn)
|
|
|
|
file_menu = self.menuBar().addMenu('&File')
|
|
|
|
new_tab_action = QAction(QIcon(os.path.join('images', 'newtab.png')), "New Tab", self)
|
|
new_tab_action.setStatusTip("New Tab")
|
|
new_tab_action.triggered.connect(lambda _: self.add_new_tab())
|
|
file_menu.addAction(new_tab_action)
|
|
|
|
|
|
|
|
open_file_action = QAction(QIcon(os.path.join('images', 'openbutton.png')), "Open file", self)
|
|
open_file_action.setStatusTip("Open file")
|
|
open_file_action.triggered.connect(self.open_file)
|
|
file_menu.addAction(open_file_action)
|
|
|
|
save_file_action = QAction(QIcon(os.path.join('images', 'savebutton.png')), "Save page to file", self)
|
|
save_file_action.setStatusTip("Save file")
|
|
save_file_action.triggered.connect(self.save_file)
|
|
file_menu.addAction(save_file_action)
|
|
|
|
help_menu = self.menuBar().addMenu('&Help')
|
|
|
|
about_action = QAction(QIcon(os.path.join('images', 'aboutbutton.png')), "About the browser", self)
|
|
about_action.setStatusTip("Find out more about Qweb")
|
|
about_action.triggered.connect(self.about)
|
|
help_menu.addAction(about_action)
|
|
|
|
self.add_new_tab(QUrl('https://www.google.com/'), 'Homepage')
|
|
|
|
self.show()
|
|
|
|
self.setWindowIcon(QIcon(os.path.join('images', 'icon.png')))
|
|
|
|
def add_new_tab(self, qurl=None, label="Blank"):
|
|
|
|
if qurl is None:
|
|
qurl = QUrl('')
|
|
|
|
browser = QWebEngineView()
|
|
browser.setUrl(qurl)
|
|
i = self.tabs.addTab(browser, label)
|
|
|
|
self.tabs.setCurrentIndex(i)
|
|
|
|
browser.urlChanged.connect(lambda qurl, browser=browser:
|
|
self.update_urlbar(qurl, browser))
|
|
browser.loadFinished.connect(lambda _, i=i, browser=browser:
|
|
self.tabs.setTabText(i, browser.page().title()))
|
|
|
|
def tab_open_doubleclick(self, i):
|
|
if i == -1:
|
|
self.add_new_tab()
|
|
|
|
def current_tab_changed(self, i):
|
|
qurl = self.tabs.currentWidget().url()
|
|
self.update_urlbar(qurl, self.tabs.currentWidget())
|
|
self.update_title(self.tabs.currentWidget())
|
|
|
|
def close_tab(self, index):
|
|
if self.tabs.count() > 1:
|
|
self.tabs.removeTab(index)
|
|
else:
|
|
self.close()
|
|
|
|
def update_title(self, browser):
|
|
if browser != self.tabs.currentWidget():
|
|
return
|
|
|
|
title = self.tabs.currentWidget().page().title()
|
|
self.setWindowTitle("%s - Qweb" % title)
|
|
|
|
def about(self):
|
|
pass
|
|
|
|
def open_file(self):
|
|
filename, _= QFileDialog.getOpenFileName(self, "Open file", "",
|
|
"*.htm *.html",
|
|
"All files (*.*)")
|
|
if filename:
|
|
with open(filename, 'r') as f:
|
|
html = f.read()
|
|
|
|
self.tabs.currentWidget().setHtml(html)
|
|
self.urlbar.setText(filename)
|
|
|
|
def save_file(self):
|
|
filename, _=QFileDialog.getSaveFileName(self, "Save page", "",
|
|
"*.htm *.html",
|
|
"All files (*.*)")
|
|
if filename:
|
|
html = self.tabs.currentWidget().page().toHtml()
|
|
with open(filename, 'w') as f:
|
|
f.write(html)
|
|
|
|
def navigate_home(self):
|
|
self.tabs.currentWidget().setUrl(QUrl('https://www.google.com/'))
|
|
def navigate_to_url(self):
|
|
q = QUrl(self.urlBar.text())
|
|
if q.scheme() == "":
|
|
q.setScheme("http")
|
|
self.tabs.currentWidget().setUrl(q)
|
|
|
|
def update_urlbar(self, q, browser=None):
|
|
if browser != self.tabs.currentWidget():
|
|
return
|
|
|
|
if q.scheme() == 'https':
|
|
self.httpsicon.setPixmap(QPixmap(os.path.join('image', 'lock-nossl.png')))
|
|
else:
|
|
self.httpsicon.setPixmap(QPixmap(os.path.join('image', 'nossl.png')))
|
|
|
|
self.urlbar.setText(q.toString())
|
|
self.urlbar.setCursorPosition(0) # Will need to be improved
|
|
class WebEngineView(QWebEngineView):
|
|
|
|
def __init__(self, mainwindow, parent=None):
|
|
super(WebEngineView, self).__init__(parent)
|
|
self.mainwindow = mainwindow
|
|
|
|
def createWindow(self, QWebEnginePage_WebWindowType):
|
|
new_webview = WebEngineView(self.mainwindow)
|
|
self.mainwindow.create_tab(new_webview)
|
|
return new_webview
|
|
|
|
if __name__ == "__main__":
|
|
app = QApplication(sys.argv)
|
|
QApplication.setApplicationName('Qweb(indev) - simple browser')
|
|
QApplication.setApplicationVersion('0.0.1')
|
|
browser = MainWindow()
|
|
browser.show()
|
|
sys.exit(app.exec_())
|
|
|
|
'''
|