import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QToolBar, QStatusBar, QVBoxLayout, QWidget
from PyQt5.QtWidgets import QAction, QTabWidget, QSizePolicy
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QIcon
class BrowserTab(QWidget):
def __init__(self, url=QUrl(''), title='HaHa'):
super().__init__()
self.layout = QVBoxLayout()
self.browser = QWebEngineView()
self.layout.addWidget(self.browser)
self.setLayout(self.layout)
self.address_bar = QLineEdit()
self.address_bar.returnPressed.connect(self.navigate_to_url)
self.layout.addWidget(self.address_bar)
self.browser.setUrl(url)
self.browser.urlChanged.connect(self.update_url)
self.browser.titleChanged.connect(self.update_title)
def navigate_to_url(self):
address = self.address_bar.text()
if address:
if 'http://' not in address and 'https://' not in address:
address = 'http://' + address
self.browser.setUrl(QUrl(address))
def update_url(self, q):
self.address_bar.setText(q.toString())
def update_title(self, title):
self.setWindowTitle(title)
class BrowserWindow(QMainWindow):
def __init__(self):
super().__init__()
self.tabs = QTabWidget()
self.tabs.setDocumentMode(True)
self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
self.tabs.currentChanged.connect(self.current_tab_changed)
self.tabs.setTabsClosable(True)
self.tabs.tabCloseRequested.connect(self.close_current_tab)
self.tabs.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
#self.setWindowIcon(QIcon("haha.ico"))
self.add_new_tab(QUrl('https://www.google.com'), 'HaHa')
self.setCentralWidget(self.tabs)
self.init_ui()
def init_ui(self):
navtb = QToolBar("Navigation")
self.addToolBar(navtb)
back_btn = QAction("←", self)
back_btn.setStatusTip("Back to previous page")
back_btn.triggered.connect(lambda: self.tabs.currentWidget().browser.back())
navtb.addAction(back_btn)
next_btn = QAction("→", self)
next_btn.setStatusTip("Forward to next page")
next_btn.triggered.connect(lambda: self.tabs.currentWidget().browser.forward())
navtb.addAction(next_btn)
reload_btn = QAction("↺", self)
reload_btn.setStatusTip("Reload page")
reload_btn.triggered.connect(lambda: self.tabs.currentWidget().browser.reload())
navtb.addAction(reload_btn)
home_btn = QAction("Home", self)
home_btn.setStatusTip("Go home")
home_btn.triggered.connect(self.navigate_home)
navtb.addAction(home_btn)
navtb.addSeparator()
# Create a new tab button
add_tab_btn = QAction("+", self)
add_tab_btn.triggered.connect(self.add_new_tab)
navtb.addAction(add_tab_btn)
# Set status bar
self.statusBar()
self.setStatusBar(QStatusBar())
# Set the main window properties
self.setWindowTitle("HaHa Browser")
self.setGeometry(100, 100, 1280, 720)
def navigate_home(self):
self.tabs.currentWidget().browser.setUrl(QUrl("https://www.google.com"))
def add_new_tab(self, qurl=QUrl(''), label="HaHa"):
if not qurl:
qurl = QUrl('https://www.google.com')
new_tab = BrowserTab(qurl, label)
self.tabs.addTab(new_tab, label)
self.tabs.setCurrentWidget(new_tab)
def tab_open_doubleclick(self, i):
if i == -1:
self.add_new_tab()
def current_tab_changed(self, i):
qurl = self.tabs.currentWidget().browser.url()
self.update_url(qurl)
def close_current_tab(self, i):
if self.tabs.count() < 2:
return
self.tabs.removeTab(i)
def update_url(self, q):
current_tab = self.tabs.currentWidget()
if current_tab:
current_tab.update_url(q)
def update_title(self, title):
self.setWindowTitle(f"{title} - HaHa Browser")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = BrowserWindow()
window.show()
sys.exit(app.exec_())
PyQt5 高級瀏覽器
最新推荐文章于 2024-07-25 00:08:05 发布