当前位置: 首页 > news >正文

pyqt自制简单浏览器(python)

确保已安装 PyQt5 和 PyQtWebEngine 库。

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QLineEdit, QAction, QListWidget, QVBoxLayout, QDialog, QMessageBox, QInputDialog, QTabWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
import json
import os

class WebEnginePage(QWebEnginePage):
    def __init__(self, parent=None, browser_window=None):
        super().__init__(parent)
        self.browser_window = browser_window  # 保存 WebBrowser 实例

    def createWindow(self, type):
        """重写 createWindow 方法以支持在新标签页中打开链接"""
        if self.browser_window:
            new_tab = self.browser_window.add_tab(QUrl("about:blank"), "新标签页")
            return new_tab.page()
        return None

class WebBrowser(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("简单浏览器")
        self.setGeometry(100, 100, 1000, 800)

        # 初始化数据
        self.history = []
        self.bookmarks = []
        self.homepage = "https://www.google.com"  # 默认主页
        self.load_data()

        # 创建标签页
        self.tabs = QTabWidget()
        self.tabs.setTabsClosable(True)
        self.tabs.tabCloseRequested.connect(self.close_tab)
        self.setCentralWidget(self.tabs)

        # 创建初始标签页
        self.add_tab(QUrl(self.homepage), "主页")

        # 创建导航栏
        self.create_navbar()

    def create_navbar(self):
        """创建导航栏"""
        navbar = QToolBar("导航栏")
        self.addToolBar(navbar)

        # 主页按钮
        home_btn = QAction("🏠", self)
        home_btn.triggered.connect(self.go_home)
        navbar.addAction(home_btn)

        # 返回按钮
        back_btn = QAction("←", self)
        back_btn.triggered.connect(self.go_back)
        navbar.addAction(back_btn)

        # 前进按钮
        forward_btn = QAction("→", self)
        forward_btn.triggered.connect(self.go_forward)
        navbar.addAction(forward_btn)

        # 刷新按钮
        refresh_btn = QAction("↻", self)
        refresh_btn.triggered.connect(self.refresh)
        navbar.addAction(refresh_btn)

        # URL 输入框
        self.url_entry = QLineEdit()
        self.url_entry.returnPressed.connect(self.load_url)
        navbar.addWidget(self.url_entry)

        # 访问按钮
        go_btn = QAction("访问", self)
        go_btn.triggered.connect(self.load_url)
        navbar.addAction(go_btn)

        # 收藏按钮
        bookmark_btn = QAction("⭐", self)
        bookmark_btn.triggered.connect(self.add_bookmark)
        navbar.addAction(bookmark_btn)

        # 历史记录按钮
        history_btn = QAction("历史", self)
        history_btn.triggered.connect(self.show_history)
        navbar.addAction(history_btn)

        # 收藏夹按钮
        bookmarks_btn = QAction("收藏夹", self)
        bookmarks_btn.triggered.connect(self.show_bookmarks)
        navbar.addAction(bookmarks_btn)

        # 设置主页按钮
        set_home_btn = QAction("设置主页", self)
        set_home_btn.triggered.connect(self.set_homepage)
        navbar.addAction(set_home_btn)

        # 新标签页按钮
        new_tab_btn = QAction("➕", self)
        new_tab_btn.triggered.connect(lambda: self.add_tab(QUrl(self.homepage), "新标签页"))
        navbar.addAction(new_tab_btn)

    def add_tab(self, url, title):
        """添加新标签页"""
        browser = QWebEngineView()
        browser.setUrl(url)
        # 使用自定义的 WebEnginePage 处理链接点击事件,并传递 WebBrowser 实例
        browser.setPage(WebEnginePage(browser, self))
        index = self.tabs.addTab(browser, title)
        self.tabs.setCurrentIndex(index)

        # 监听网页标题变化,更新标签页标题
        browser.titleChanged.connect(lambda title, idx=index: self.tabs.setTabText(idx, title))
        return browser

    def close_tab(self, index):
        """关闭标签页"""
        if self.tabs.count() > 1:
            self.tabs.removeTab(index)

    def get_current_browser(self):
        """获取当前标签页的浏览器实例"""
        return self.tabs.currentWidget()

    def load_url(self):
        """加载 URL"""
        url = self.url_entry.text().strip()
        if not url.startswith(("http://", "https://")):
            url = "https://" + url
        self.get_current_browser().setUrl(QUrl(url))
        self.add_to_history(url)

    def go_home(self):
        """返回主页"""
        self.get_current_browser().setUrl(QUrl(self.homepage))

    def set_homepage(self):
        """设置主页"""
        url, ok = QInputDialog.getText(self, "设置主页", "请输入主页 URL:", text=self.homepage)
        if ok and url:
            if not url.startswith(("http://", "https://")):
                url = "https://" + url
            self.homepage = url
            self.save_data()

    def go_back(self):
        """返回上一页"""
        self.get_current_browser().back()

    def go_forward(self):
        """前进到下一页"""
        self.get_current_browser().forward()

    def refresh(self):
        """刷新页面"""
        self.get_current_browser().reload()

    def add_to_history(self, url):
        """添加到历史记录"""
        self.history.append(url)
        self.save_data()

    def add_bookmark(self):
        """添加收藏"""
        url = self.url_entry.text().strip()
        if url and url not in self.bookmarks:
            self.bookmarks.append(url)
            self.save_data()
            QMessageBox.information(self, "成功", "已添加到收藏夹")

    def show_history(self):
        """显示历史记录"""
        history_window = QDialog(self)
        history_window.setWindowTitle("历史记录")
        history_window.setGeometry(200, 200, 400, 300)

        history_list = QListWidget()
        for url in self.history:
            history_list.addItem(url)

        layout = QVBoxLayout()
        layout.addWidget(history_list)
        history_window.setLayout(layout)

        history_window.exec_()

    def show_bookmarks(self):
        """显示收藏夹"""
        bookmarks_window = QDialog(self)
        bookmarks_window.setWindowTitle("收藏夹")
        bookmarks_window.setGeometry(200, 200, 400, 300)

        bookmarks_list = QListWidget()
        for url in self.bookmarks:
            bookmarks_list.addItem(url)

        layout = QVBoxLayout()
        layout.addWidget(bookmarks_list)
        bookmarks_window.setLayout(layout)

        bookmarks_window.exec_()

    def load_data(self):
        """加载历史记录和收藏夹数据"""
        if os.path.exists("browser_data.json"):
            with open("browser_data.json", "r") as f:
                data = json.load(f)
                self.history = data.get("history", [])
                self.bookmarks = data.get("bookmarks", [])
                self.homepage = data.get("homepage", "https://www.google.com")

    def save_data(self):
        """保存历史记录和收藏夹数据"""
        data = {
            "history": self.history,
            "bookmarks": self.bookmarks,
            "homepage": self.homepage
        }
        with open("browser_data.json", "w") as f:
            json.dump(data, f)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    browser = WebBrowser()
    browser.show()
    sys.exit(app.exec_()) 

相关文章:

  • QT c++ QObject::connect函数 线程给界面发送数据
  • JavaScript设计模式 -- 观察者模式
  • 《玩转AI大模型:从入门到创新实践》(8)第六章 进阶实战:定制你的AI大脑
  • Ollama本地部署DeepSeek+构建个人知识库笔记
  • C语言:数据的存储
  • 自动化测试实战
  • uake 网络安全 reverse网络安全
  • 2.7 静态方法/构造函数Mock
  • JAVA高级工程师-面试经历(含面试问题及解答)
  • 分享 UniApp 中超好看的卡片阴影样式
  • 【Stable Diffusion部署至Google Colab】
  • c/c++蓝桥杯经典编程题100道(19)质因数分解
  • 天芒传奇Ⅱ·前传-特殊武器
  • ds-download-link 插件:以独特图标选择,打造文章下载链接
  • 易仓科技ai面试
  • 关于uniapp使用pinia持久化配置兼容问题
  • 27、深度学习-自学之路-NLP自然语言处理-做一个简单的项目识别一组电影评论,来判断电影评论是积极的,还是消极的。
  • 【设计模式】【行为型模式】备忘录模式(Memento)
  • 【电脑】u盘重装win7
  • 国家2025年数字化污水厂政策与视频孪生赋能智慧污水厂建设
  • 2017网站建设价目表/个人在线做网站免费
  • 中山网站建设公司/定制网站建设
  • 清溪镇网站仿做/怎么建网站教程
  • 页游网站如何做推广/如何推销自己的产品
  • 舟山城乡建设培训中心网站/汕头网站建设方案维护
  • 做视频网站玩什么配置/关键词优化公司费用多少