python3GUI--浏览器By:PyQt5(附源码)


时隔一个月,使用PyQt5开发了一款浏览器,不但能满足日常网页浏览,还支持一些辅助功能,例如:截图、收藏网址、查看浏览历史、主题颜色设置…来吧~
请添加图片描述

一.准备工作

1.PyQt5

pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。本教程使用Python 3。Qt库是最强大的GUI库之一。pyqt5的官方网站https://doc.qt.io/qtforpython-5/
pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS。pyqt5是双重许可。开发者可以在GPL和商业许可之间进行选择。安装:

pip install PyQt5

PyQt5官方文档:

https://doc.qt.io/qtforpython-5

2.Qwebengineview

pyqt5 已经抛弃 QtWebKit和QtWebKitWidgets,而使用最新的QtWebEngineWidgets。QtWebEngineWidgets,是基于chrome浏览器内核引擎的。安装:

pip install PyQtWebEngine

QWebEngineView官方文档:

https://doc.qt.io/qtforpython-5/PySide2/QtWebEngineWidgets/QWebEngineView.html

3.PyQt5-tools

PyQt5-tools里面包含了一系列QT开发的GUI工具,能有效减少代码量。

在PyQt中编写UI界面可以直接通过代码来实现,也可以通过Qt Designer来完成。Qt Designer的设计符合MVC的架构,其实现了视图和逻辑的分离,从而实现了开发的便捷。Qt Designer中的操作方式十分灵活,其通过拖拽的方式放置控件可以随时查看控件效果。Qt Designer生成的.ui文件(实质上是XML格式的文件)也可以通过pyuic5工具转换成.py文件。
Qt Designer随PyQt5-tools包一起安装,其安装路径在 “Python安装路径\Lib\site-packages\pyqt5-tools”下。
若要启动Qt Designer可以直接到上述目录下,双击designer.exe打开Qt Designer;或将上述路径加入环境变量,在命令行输入designer打开;或在PyCharm中将其配置为外部工具打开。

二.功能展示

1.主页

浏览器启动后,会自动打开设定好的网页。
在这里插入图片描述

2.我的收藏

通过读取本地指定txt文件,显示收藏的链接。
请添加图片描述

3.浏览历史

此界面记录所有本次浏览历史记录。
请添加图片描述

4.网页截图

通过调用自带的API实现网页截图。
请添加图片描述

5.收藏

点击收藏,将网页收藏到我的收藏

6.复制链接

复制当前浏览器网页链接地址到剪切板。

7.网页放大/缩小

通过点击工具栏按钮和设置中的组合栏对浏览器网页进行缩放操作,同时显示当前浏览器放大比例。
请添加图片描述

8.设置-基本

在基本设置中可以设置主页、搜索引擎、网页缩放比例。
在这里插入图片描述

9.设置-个性

在个性设置中,可以设置主题颜色、UA、语言等。
在这里插入图片描述

10.设置-隐私

在隐私设置中,可以清理浏览历史记录、cookie、设置文件下载路径、截图保存路径
在这里插入图片描述

三.界面设计

1.主窗口设计

请添加图片描述

2.设置窗口设计

1.设置-基本

请添加图片描述
2.设置-个性
在这里插入图片描述3.设置-隐私

在这里插入图片描述

3.整体QSS设计

使用QSS,设置浏览器整体颜色风格,设置控件边框颜色、边框角度等视觉展示效果,首次启动默认使用此颜色作为主题颜色。

四.源代码

1.my_web_view.py(主程序)

import os
import re
import sys
from webbrowser import open_new_tab
from utils import Util
from PyQt5.uic import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWebEngineWidgets import  QWebEngineView,QWebEngineSettings,QWebEnginePage
# from get_input_suggests import get_suggests
from history import History_Ui_Form
from liulanqi import Web_browser_Ui_MainWindow
from main_set import Main_set_Ui_Dialog
from my_favourite import Favourite_Ui_Form
from about_author import About_author_Ui_Dialog
from window_zoom import Ui_Form

"""
网页缩放弹出当前缩放系数

QWebEngineSettings
QWebEngineDownloadItem
QWebEngineProfile
QWebEnginePage

从页面保存东西还是存在问题

"""

class History_Window(QWidget,History_Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)


class Favourite_Window(QWidget,Favourite_Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

class Main_set_Window(QWidget,Main_set_Ui_Dialog):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

class About_author_Window(QWidget,About_author_Ui_Dialog):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

class Main_Window(QMainWindow,Web_browser_Ui_MainWindow):
    def __init__(self):
        super().__init__()
        # self.setupUi(self)


class Message_Window(QWidget,Ui_Form):
    zoom_change_single=pyqtSignal(str)
    show_set_change_message_single=pyqtSignal(str)
    main_ui_size_change_single=pyqtSignal(int,int)
    color_set_single=pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setStyleSheet("""QLabel{
        	color: rgb(255, 170, 255);
        }""")
        self.setAttribute(Qt.WA_TranslucentBackground)  # 窗体背景透明
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.Tool)  # 窗口置顶,无边框,在任务栏不显示图标
        self.zoom_change_single.connect(self.change_zoom_text)
        self.show_set_change_message_single.connect(self.show_set_change_message)
        self.main_ui_size_change_single.connect(self.set_window_location)
        self.color_set_single.connect(self.change_theme_color)

    def set_window_location(self,x,y):
        self.move(x,y)

    def change_theme_color(self,color):
        self.setStyleSheet("""QLabel{
	
	color: {my_color};
}""".replace("{my_color}",color))
    @pyqtSlot(str)
    def change_zoom_text(self,zoom_factor):
        self.label.setText(f'<html><head/><body><p align=\"center\"><span style=\" font-size:18pt; \">当前缩放比例{zoom_factor}</span></p></body></html>')

    @pyqtSlot(str)
    def show_set_change_message(self,message):
        self.label.setText(f'<html><head/><body><p align=\"center\"><span style=\" font-size:18pt; \">{message}</span></p></body></html>')

    @pyqtSlot(int,int)
    def set_window_loaction(self,center_x,center_y):
        pass

class My_Web_View(QWebEngineView):
    # 重写createwindow()
    def createWindow(self,QWebEnginePage_WebWindowType):
        page = My_Web_View(self)
        page.setPage(CustomWebEnginePage())
        page.urlChanged.connect(self.on_url_changed)
        return page

    def on_url_changed(self,url):
        self.setUrl(url)
        #0927  这里有点问题
        My_Web_Broswer().ui.action_houtui.setEnabled(True)

class CustomWebEnginePage(QWebEnginePage):
    def __init__(self):
        super().__init__()

    def certificateError(self,QWebEngineCertificateError):
        """
        屏蔽ssl证书错误警告
        :param QWebEngineCertificateError:
        :return:
        """
        return True

class My_Web_Broswer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.u=Util()
        self.zoom_factor=1.0
        self.default_screenshot_save_path=os.path.expanduser('~')
        self.message_ui=Message_Window()
        self.ui=Main_Window()
        self.ui.setupUi(self)#此处很关键
        self.his_ui=History_Window()
        self.collect_ui=Favourite_Window()
        self.main_set_ui=Main_set_Window()
        self.about_author_ui=About_author_Window()
        self.collection_txt='./my_favourite.txt'
        self.homepage_url="https://www.baidu.com/"
        self.search_engine_base_url="https://www.baidu.com/s?wd="
        self.theme_color="#ff55ff"
        self.WebEngineView=My_Web_View()
        self.setWindowTitle('正在加载...')
        self.Layout = QHBoxLayout(self.ui.frame)
        self.Layout.setContentsMargins(0, 0, 0, 0)
        self.Layout.addWidget(self.WebEngineView)
        self.ui.progressBar_download_progress.hide()
        self.ui.action_qianjin.setEnabled(False)
        self.ui.action_houtui.setEnabled(False)
        self.ui.lineEdit.returnPressed.connect(self.do_enter)
        self.ui.action_houtui.triggered.connect(lambda: self.WebEngineView.back())
        self.ui.action_qianjin.triggered.connect(lambda: self.WebEngineView.forward())
        self.ui.action_shuaxin.triggered.connect(lambda: self.WebEngineView.reload())
        self.ui.action_tingzhi.triggered.connect(lambda: self.WebEngineView.stop())
        self.ui.action_screen_shot.triggered.connect(self.do_screen_shot)
        self.ui.action_about_author.triggered.connect(lambda: self.about_author_ui.show())
        self.ui.action_about_software.triggered.connect(lambda:QMessageBox.information(self,"提示",'Design By QT'))
        self.ui.action_about_qt.triggered.connect(self.show_qt)
        self.ui.action_main_set.triggered.connect(self.main_set_init)
        self.ui.action_tuichu.triggered.connect(self.close)
        self.ui.action_daozhuye.triggered.connect(lambda :self.WebEngineView.setUrl(QUrl(self.homepage_url)))
        self.ui.action_guanyv.triggered.connect(lambda :self.about_author_ui.show())
        self.ui.action_fangda.triggered.connect(self.do_zoom_webview)
        self.ui.action_suoxiao.triggered.connect(self.do_zoom_webview)
        self.ui.action_copy_current_link.triggered.connect(self.copy_current_link)
        self.ui.action_lishi.triggered.connect(self.show_history)
        self.ui.action_my_collection.triggered.connect(self.show_my_favourite)
        self.ui.action_collect.triggered.connect(self.do_collcet)

        self.WebEngineView.urlChanged.connect(self.show_jump_url)
        self.WebEngineView.loadProgress.connect(self.show_load_progress)
        self.WebEngineView.loadFinished.connect(self.change_history_state)
        self.WebEngineView.iconChanged.connect(lambda icon:self.setWindowIcon(icon))
        self.WebEngineView.page().profile().downloadRequested.connect(self.select_save_dir)
        # self.WebEngineView.setContextMenuPolicy(Qt.CustomContextMenu)  # 将浏览器右键菜单设置为用户自定义菜单

        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True)
        self.WebEngineView.settings().setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
        self.WebEngineView.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)
        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.AutoLoadImages, True)
        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.FocusOnNavigationEnabled, True)
        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True)

        self.WebEngineView.load(QUrl(self.homepage_url))
        # self.ui.lineEdit.textEdited.connect(self.show_suggest_words)   #输入建议
        self.ui.lineEdit.textEdited.connect(self.judge_input)   #输入建议
        self.ui.pushButton.clicked.connect(self.do_enter)
        self.WebEngineView.page().fullScreenRequested.connect(self._fullScreenRequested)
        self.init_collections()

    def do_screen_shot(self):
        if self.is_load_finish_flag:
            time_string = self.u.get_time_string().replace(" ", '').replace("-", '').replace(":", '')
            save_screen_shot_file_name = "网页截图_" + time_string + ".png"
            file_name=f"{self.default_screenshot_save_path}\{save_screen_shot_file_name}"
            self.WebEngineView.grab().save(file_name, b'PNG')
            ret=QMessageBox.information(self,"提示",f"截图成功,是否打开此截图?",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
            if ret==QMessageBox.Yes:
                os.startfile(file_name)
        else:
            QMessageBox.warning(self,"警告","请等待网页加载完成")

    def show_qt(self):
        QMessageBox.aboutQt(self, "关于QT")

    def do_zoom_webview(self):
        text=self.sender().text()
        if "缩小" in text:
            self.zoom_factor=self.WebEngineView.zoomFactor() - 0.1
        elif "放大"in text:
            self.zoom_factor=self.WebEngineView.zoomFactor() + 0.1
        self.message_ui.zoom_change_single.emit(str(int(self.zoom_factor*100))+"%")
        self.message_ui.show()
        self.WebEngineView.setZoomFactor(self.zoom_factor)

    #---设置---
    def main_set_init(self):
        self.zoom_factor_str_list=["30%","50%","80%","100%","120%","150%","180%","200%","250%","300%","400%","500%"]
        self.main_set_ui.tabWidget.setCurrentIndex(0)
        self.ua_list=['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.15.2 Chrome/83.0.4103.122 Safari/537.36','Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Mobile Safari/537.36','Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1','Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1']
        #设置代理
        # print(self.WebEngineView.page().profile().httpUserAgent())
        # self.WebEngineView.page().profile().setHttpUserAgent("Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Mobile Safari/537.36")
        # self.main_set_ui.tabWidget.setTabEnabled(3,False)   #设置指定页面可用
        self.main_set_ui.label_13.setText(f"一共产生了<a style=color:#ff55ff>{self.u.format_size(self.WebEngineView.page().profile().httpCacheMaximumSize())}</a>缓存文件")
        self.main_set_ui.label_15.setText(f"一共产生了<a style=color:#ff55ff>{self.WebEngineView.history().count()}</a>个历史记录")
        # print(self.WebEngineView.page().devToolsPage())
        self.main_set_ui.pushButton_5.clicked.connect(self.delete_cache)
        self.main_set_ui.pushButton_6.clicked.connect(self.delete_cookies)
        self.main_set_ui.pushButton_7.clicked.connect(self.delete_session_cookie)
        self.main_set_ui.pushButton_4.clicked.connect(self.clear_history_record)
        self.main_set_ui.lineEdit.setText(self.homepage_url)
        default_down_dir=self.WebEngineView.page().profile().downloadPath()
        default_UA=self.WebEngineView.page().profile().httpUserAgent()  #默认UA
        if "Windows NT" in default_UA:
            self.main_set_ui.comboBox_2.setCurrentIndex(0)
        elif "Android" in default_UA:
            self.main_set_ui.comboBox_2.setCurrentIndex(1)
        elif "iPhone" in default_UA:
            self.main_set_ui.comboBox_2.setCurrentIndex(2)
        elif "ipad" in default_UA:
            self.main_set_ui.comboBox_2.setCurrentIndex(3)
        self.main_set_ui.comboBox_2.currentIndexChanged[int].connect(self.change_ua)
        self.main_set_ui.comboBox.currentIndexChanged.connect(self.change_search_engine)
        self.main_set_ui.comboBox_2.setToolTip(self.main_set_ui.comboBox_2.currentText())
        self.main_set_ui.lineEdit_2.setText(default_down_dir)
        self.main_set_ui.checkBox_2.stateChanged.connect(lambda :        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.SpatialNavigationEnabled, True)if self.main_set_ui.checkBox_2.isChecked()else self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.SpatialNavigationEnabled, False))
        self.main_set_ui.checkBox_4.stateChanged.connect(lambda :        self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.AllowGeolocationOnInsecureOrigins, True)if self.main_set_ui.checkBox_4.isChecked()else self.WebEngineView.page().settings().setAttribute(QWebEngineSettings.AllowGeolocationOnInsecureOrigins, False))

        self.main_set_ui.checkBox_6.stateChanged.connect(self.process_debug)
        self.main_set_ui.pushButton_3.clicked.connect(self.select_download_base_dir)
        self.main_set_ui.comboBox_4.currentIndexChanged.connect(lambda :self.WebEngineView.page().settings().setDefaultTextEncoding(self.main_set_ui.comboBox_2.currentText()))#改变当前编码
        zoom_factor_str=str(int(self.zoom_factor * 100))+"%"
        if zoom_factor_str in self.zoom_factor_str_list:
            self.main_set_ui.comboBox_5.setCurrentText(zoom_factor_str)
        else:
            self.main_set_ui.comboBox_5.addItem(zoom_factor_str) #这里可能产生溢出)
            self.main_set_ui.comboBox_5.setCurrentText(zoom_factor_str)
        self.main_set_ui.comboBox_5.currentIndexChanged.connect(self.change_zoom_factor)#改变当前放大倍数
        self.main_set_ui.checkBox.stateChanged.connect(lambda :self.WebEngineView.page().profile().setSpellCheckEnabled(True) if self.main_set_ui.checkBox.isChecked() else self.WebEngineView.page().profile().setSpellCheckEnabled(False))
        self.main_set_ui.checkBox_3.stateChanged.connect(lambda :self.WebEngineView.page().profile().setUseForGlobalCertificateVerification(True) if self.main_set_ui.checkBox_3.isChecked() else self.WebEngineView.page().profile().setUseForGlobalCertificateVerification(False) )
        self.main_set_ui.lineEdit.editingFinished.connect(self.change_homepage_url)
        self.main_set_ui.pushButton_2.clicked.connect(self.change_theme_color)
        self.main_set_ui.lineEdit_3.setText(self.default_screenshot_save_path)
        self.main_set_ui.pushButton_10.clicked.connect(self.set_default_screenshot_dir)
        self.main_set_ui.checkBox_7.stateChanged.connect(self.do_process_proxy)
        self.main_set_ui.show()

    def do_process_proxy(self):
        if self.main_set_ui.checkBox_7.isChecked():
            self.main_set_ui.lineEdit_6.setEnabled(True)
            self.main_set_ui.lineEdit_7.setEnabled(True)
        else:
            self.main_set_ui.lineEdit_6.setEnabled(False)
            self.main_set_ui.lineEdit_7.setEnabled(False)


    def set_default_screenshot_dir(self):
        dir=QFileDialog.getExistingDirectory(self,'.')
        if dir:
            self.main_set_ui.lineEdit_3.setText(dir)
            self.default_screenshot_save_path=dir

    def change_ua(self,index):
        current_ua=self.main_set_ui.comboBox_2.currentText()
        self.WebEngineView.page().profile().setHttpUserAgent(self.ua_list[index])
        self.message_ui.show_set_change_message_single.emit(f"当前UA为:{current_ua}")
        self.main_set_ui.comboBox_2.setToolTip(current_ua)
        self.message_ui.show()

    @pyqtSlot()
    def change_theme_color(self):
        color=QColorDialog.getColor()
        if color.isValid():
            rgb_str=f"rgb({color.red()},{color.green()},{color.blue()})"
            self.theme_color=rgb_str
            if rgb_str=="rgb(0,0,0)":
                return
            new_qss_style="""
            QProgressBar {   
text-align: center;
border: 2px solid grey;   
border-radius: 5px;   
background-color: #FFFFFF;}
QProgressBar::chunk {   
background-color: {rgb_str};
width: 1px;
}
            QPushButton {
        border: 1px solid ;
        border-radius: 4px;
        padding: 1px 4px;
        min-width: 80px;
        min-height: 20px;
    }
    
    QPushButton:hover{
        background-color:rgb(255, 255, 255);
        border-color:{rgb_str};
    
    }
    
    QCheckBox:hover{
        background-color:{rgb_str};
    }
    
    QLineEdit{
        border: 1px solid ;
        border-radius: 4px;
        selection-background-color:{rgb_str};
        border: 1px solid;
        border-style: inset;
    }
    QLineEdit:hover{
        border-color:{rgb_str};
    }
    QLineEdit:focus{
        border-color: {rgb_str};
    }
    
    QLabel {
        background: transparent;
        border: 1px solid transparent;
        padding: 1px;
    }
    QComboBox{
        margin:2px;
        border: 1px solid ;
        border-radius: 4px;
        background-color:rgb(255, 255, 255);
        border-color:rgb(0, 0, 0);
        min-width: 60px;
        min-height: 23px;
        max-width: 200px;
        max-height: 23px;
    }
    QComboBox:hover{
        background-color:rgb(255, 255, 255);
        border-color:{rgb_str};
    
    }
    QToolBar{
        margin:2px;
        border: 1px solid ;
        border-radius: 4px;
        background-color:rgb(255, 255, 255);
        border-color: rgb(0, 0, 0);
    
    }
    QToolBar:hover{
        background-color:rgb(255, 255, 255);
        border-color:{rgb_str};
    
    }
    
    
    QGroupBox {
        background-color: rgb(255, 255, 255);
        border: 1px solid ;
        border-radius: 4px;
        margin-top:1em;
    }
    QGroupBox::title {
        subcontrol-origin: margin;
        subcontrol-position: top left;
        top: 0.1em;
        background-color: {rgb_str};
    font-size:10px
    }""".replace("{rgb_str}",rgb_str)
            self.setStyleSheet(new_qss_style)
            self.main_set_ui.setStyleSheet(new_qss_style)
            self.about_author_ui.setStyleSheet(new_qss_style)
            self.main_set_ui.label_7.setText(f"<a style=color:{rgb_str}>主题颜色</a>")
            self.main_set_ui.label_13.setText(f"一共产生了<a style=color:{rgb_str}>{self.u.format_size(self.WebEngineView.page().profile().httpCacheMaximumSize())}</a>缓存文件")
            self.main_set_ui.label_15.setText(f"一共产生了<a style=color:{rgb_str}>{self.WebEngineView.history().count()}</a>个历史记录")
            self.his_ui.label.setText(f'一共有<a style=color:{rgb_str}>{self.WebEngineView.page().history().count()}</a>个历史记录,双击跳转')
            self.collect_ui.label.setText(f'一共有<a style=color:{rgb_str}>{len(self.collections)}</a>个收藏,双击跳转')
            self.message_ui.color_set_single.emit(rgb_str)


    def change_zoom_factor(self):
        current_zoom_factor_str=self.main_set_ui.comboBox_5.currentText()
        zoom_factor=float(int(current_zoom_factor_str.split("%")[0])/100)
        self.zoom_factor=zoom_factor
        self.WebEngineView.page().setZoomFactor(zoom_factor)
        zoom_factor_precent=int(self.zoom_factor * 100) #这里可能产生溢出
        if str(zoom_factor_precent).endswith("9"):
            zoom_factor_precent+=1
        self.message_ui.zoom_change_single.emit(str(zoom_factor_precent)+"%")
        self.message_ui.show()


    def change_homepage_url(self):
        user_input=self.main_set_ui.lineEdit.text()
        if user_input.startswith("https://") or user_input.startswith("http://"):
            self.homepage_url =user_input
        else:
            self.message_ui.show_set_change_message_single.emit("主页输入有误,请检查!")
            #QMessageBox.warning(self,"警告",'主页输入有误,请检查!')
            self.message_ui.show()

    def process_debug(self):
        if self.main_set_ui.checkBox_6.isChecked():
            self.main_set_ui.lineEdit_5.setEnabled(True)
            self.main_set_ui.pushButton_8.setEnabled(True)
            port=self.main_set_ui.lineEdit_5.text()
            debug_url='http://127.0.0.1:%s' % port
            os.environ["QTWEBENGINE_REMOTE_DEBUGGING"] = port
            self.main_set_ui.pushButton_8.clicked.connect(lambda :open_new_tab(debug_url))

        else :
            self.main_set_ui.lineEdit_5.setEnabled(False)
            self.main_set_ui.pushButton_8.setEnabled(False)

    def delete_cache(self):
        self.WebEngineView.page().profile().clearHttpCache()
        self.message_ui.show_set_change_message_single.emit("缓存已清空!")
        # QMessageBox.information(self,"提示","缓存已清空!")
        self.message_ui.show()

    def delete_cookies(self):
        self.WebEngineView.page().profile().cookieStore().deleteAllCookies()
        self.message_ui.show_set_change_message_single.emit("cookie已清空!")
        # QMessageBox.information(self,"提示","cookie已清空!")
        self.message_ui.show()

    def clear_history_record(self):
        self.WebEngineView.page().history().clear()
        self.message_ui.show_set_change_message_single.emit("历史浏览记录已清理!")
        # QMessageBox.information(self,"提示","历史浏览记录已清空!")
        self.main_set_ui.label_15.setText(f"一共产生了<a style=color:{self.theme_color}>{self.WebEngineView.history().count()}</a>个历史记录")
        self.message_ui.show()

    def delete_session_cookie(self):
        self.WebEngineView.page().profile().cookieStore().deleteSessionCookies()
        self.message_ui.show_set_change_message_single.emit("会话cookie已清空!")
        # QMessageBox.information(self,"提示","会话cookie已清空!")
        self.message_ui.show()

    def select_download_base_dir(self):
        dir=QFileDialog.getExistingDirectory(None,"选择默认文件下载目录",'.')
        if dir :
            self.main_set_ui.lineEdit_2.setText(dir)
        else:
            pass

    def change_search_engine(self):
        #改变搜索引擎
        current_select=self.main_set_ui.comboBox.currentText()
        if current_select=="百度":
            self.search_engine_base_url='https://www.baidu.com?wd='
        elif current_select=="搜狗":
            self.search_engine_base_url='https://www.sogou.com/web?query='
        elif current_select=="Google":
            self.search_engine_base_url='https://www.google.com.hk/search?q=%E5%8A%A0%E6%B2%B9'
        elif current_select=="360":
            self.search_engine_base_url='https://www.so.com/s?ie=utf-8&fr=none&src=360sou_newhome&q='
        elif current_select=="Bing":
            self.search_engine_base_url='https://www.bing.com/search?q='
        else:
            pass
        self.message_ui.show_set_change_message_single.emit(f"当前搜索引擎为:{current_select}")
        self.message_ui.show()

    #---我的收藏---
    def init_collections(self):
        try:
            collections=self.u.read_txt(self.collection_txt)
            collections.reverse()
            self.collections=collections
        except AttributeError:
            self.collections=[]

    def do_collcet(self):
        try:
            time_string=self.u.get_time_string()
            url=self.WebEngineView.url().toString()
            self.init_collections()
            if url not  in [url.split('\t')[1] for url in self.collections]:
                title=self.WebEngineView.title()
                data=time_string+'\t'+url+'\t'+title+'\n'
                self.u.write_to_txt(self.collection_txt,data)
                QMessageBox.information(self,"提示",'收藏成功!')
            else:
                QMessageBox.warning(self, '警告', '此网站已被收藏,请勿重复收藏!')
        except Exception as e:
            QMessageBox.critical(self,'错误','收藏失败!')

    def show_my_favourite(self):
        self.init_collections()
        self.collect_ui.tableWidget.clear()
        self.collect_ui.tableWidget.setHorizontalHeaderLabels(['时间','地址'])
        if self.collections:
            collections_num=len(self.collections)
            self.collect_ui.tableWidget.setRowCount(collections_num)
            self.collect_url_list=[]
            for index,line in enumerate(self.collections):
                time_string,url,title=line.strip().split('\t')
                new_table_widget_item1 = QTableWidgetItem(time_string)
                new_table_widget_item2 = QTableWidgetItem(title)
                new_table_widget_item2.setToolTip(title)
                self.collect_url_list.append(url)
                new_table_widget_item1.setIcon(QtGui.QIcon(QtGui.QPixmap('./icons/shoucang.png')))
                self.collect_ui.tableWidget.setItem(index, 0, new_table_widget_item1)
                self.collect_ui.tableWidget.setItem(index, 1, new_table_widget_item2)
            self.collect_ui.label.setText(f'一共有<a style=color:{self.theme_color}>{collections_num}</a>个收藏,双击跳转')
            self.collect_ui.tableWidget.cellDoubleClicked.connect(self.jump_url_by_collect)
            self.collect_ui.tableWidget.customContextMenuRequested.connect(self.show_collect_menu)
        else:
            self.collect_ui.label.setText('您还没有收藏,快去收藏吧!')
        self.collect_ui.show()

    def show_collect_menu(self,pos):
        menu = QMenu()
        item1 = menu.addAction("访问")
        item2 = menu.addAction("移除")
        screenPos = self.collect_ui.tableWidget.mapToGlobal(pos)
        # 被阻塞
        action = menu.exec(screenPos)
        current_row = self.collect_ui.tableWidget.currentRow()
        if action==item1:
            self.jump_url_by_collect(current_row)
        elif action==item2:
            collections=self.u.read_txt(self.collection_txt)
            collections.reverse()
            del collections[current_row]
            del self.collect_url_list[current_row]
            row_new_num=len(collections)
            os.remove(self.collection_txt)
            self.collect_ui.tableWidget.clear()
            self.collect_ui.tableWidget.setRowCount(row_new_num)
            self.collect_ui.tableWidget.setHorizontalHeaderLabels(['时间','地址'])
            for index,collection in enumerate(collections):
                self.u.write_to_txt(self.collection_txt,collection)#逐行写入
                time_string, url, title = collection.strip().split('\t')
                new_table_widget_item1 = QTableWidgetItem(time_string)
                new_table_widget_item2 = QTableWidgetItem(title)
                new_table_widget_item2.setToolTip(title)
                self.collect_url_list.append(url)
                new_table_widget_item1.setIcon(QtGui.QIcon(QtGui.QPixmap('./icons/shoucang.png')))
                self.collect_ui.tableWidget.setItem(index, 0, new_table_widget_item1)
                self.collect_ui.tableWidget.setItem(index, 1, new_table_widget_item2)
            self.collect_ui.label.setText(f'一共有<a style=color:{self.theme_color}>{row_new_num}</a>个收藏,双击跳转')
        else:
            pass

    def jump_url_by_collect(self,row):
        current_url=self.collect_url_list[row]
        self.WebEngineView.setUrl(QUrl(current_url))
        self.collect_ui.hide()

    def judge_input(self,text):
        pattern = re.compile(
            r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|'
            r'([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|'
            r'([a-zA-Z0-9][-_.a-zA-Z0-9]{0,61}[a-zA-Z0-9])).'
            r'([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}.[a-zA-Z]{2,3})$'
        )
        if re.match(pattern,text) or text.startswith('https://') or text.startswith('http://'):
            self.ui.pushButton.setText('转到')
        else:
            self.ui.pushButton.setText('搜索')
    #---收藏end---

    #---下载----
    def select_save_dir(self,download):
        """
        选择下载文件地址    这个函数存在问题
        :param download:
        :return:
        """
        download.finished.connect(self._finished)
        the_sourceFile = os.path.join(self.WebEngineView.page().profile().downloadPath(), download.suggestedFileName())
        download.setPath(the_sourceFile)
        download.accept()

    def _finished(self):
        self.message_ui.show_set_change_message_single.emit("一个文件下载完成!")

    def show_jump_url(self,url):
        self.ui.progressBar_load_progress.show()
        self.ui.lineEdit.setText(url.toString())

    def do_enter(self):
        """
        对输入进行校验,如果为域名,则转到对应http网站
        否则,视为百度
        :return:
        """
        user_input=self.ui.lineEdit.text()
        pattern = re.compile(
            r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|'
            r'([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|'
            r'([a-zA-Z0-9][-_.a-zA-Z0-9]{0,61}[a-zA-Z0-9])).'
            r'([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}.[a-zA-Z]{2,3})$'
        )
        q=QUrl(user_input)
        if re.match(pattern,user_input) or user_input.startswith('https://') or user_input.startswith('http://'):
            q.setScheme('http')
        else:
            q = QUrl(self.search_engine_base_url+user_input)
        self.WebEngineView.setUrl(q)

    def show_load_progress(self,progress):
        """
        网页加载时,进度条、状态栏显示加载进度
        :param progress:
        :return:
        """
        if progress==100:
            self.statusBar().showMessage('完成',2000)
            self.ui.progressBar_load_progress.hide()
            self.is_load_finish_flag=True
            self.ui.action_tingzhi.setEnabled(False)
            title = self.WebEngineView.page().title()
            self.setWindowTitle(title)
        else:
            self.statusBar().showMessage(str(progress)+'%')
            self.is_load_finish_flag=False
            self.ui.action_tingzhi.setEnabled(True)
            title = self.WebEngineView.page().title()
            if title.startswith('http') or title.startswith('https'):
                title = '正在加载...'
            self.setWindowTitle(title)
        self.ui.progressBar_load_progress.setValue(progress)

    def do_set_homepage(self):
        """
        设置浏览器主页
        :return:
        """
        if self.is_load_finish_flag:
            self.homepage_url=self.WebEngineView.page().url()
            current_url_title=self.WebEngineView.page().title()
            QMessageBox.information(self,'提示',f'主页已设置为:{current_url_title}')
            self.ui.action_daozhuye.setToolTip(current_url_title)
        else:
            QMessageBox.warning(self,'警告','请等待网页加载完成!')

    def change_history_state(self):
        """
        当网页开始加载时,tabname定义为“正在加载...”
        :return:
        """
        if self.WebEngineView.history().canGoBack():
            self.ui.action_houtui.setEnabled(True)
        else:
            self.ui.action_houtui.setEnabled(False)
        if self.WebEngineView.history().canGoForward():
            self.ui.action_qianjin.setEnabled(True)
        else:
            self.ui.action_qianjin.setEnabled(False)
        back_url_title=self.WebEngineView.history().backItem().title()
        self.ui.action_houtui.setToolTip(back_url_title)
        forward_url_title=self.WebEngineView.history().forwardItem().title()
        self.ui.action_qianjin.setToolTip(forward_url_title)

    def copy_current_link(self):
        clipbord = QApplication.clipboard()  # 操作剪切板
        clipbord.setText(self.WebEngineView.page().url().toString())
        QMessageBox.information(self,'提示','网址已经复制')

    #---历史记录---
    def show_history(self):
        items=self.WebEngineView.history().items()
        self.his_ui.tableWidget.clear()
        self.url_list=[]
        row_num =len(items)
        self.his_ui.tableWidget.setRowCount(row_num)
        self.his_ui.tableWidget.setHorizontalHeaderLabels(['地址'])
        items.reverse()
        for index,item in enumerate(items):
            url=item.url().toString()
            self.url_list.append(url)
            title=item.title()
            if title=='':
                #获取不到title的网站返回url
                title=url
            # icon=item.iconUrl()#加载Icon没思路
            # print(icon)
            # ico=QtGui.QIcon()
            new_table_widget_item = QTableWidgetItem(title)
            new_table_widget_item.setToolTip(title)
            # new_table_widget_item.setIcon(QtGui.QIcon())
            self.his_ui.tableWidget.setItem(index, 0, new_table_widget_item)
        self.his_ui.tableWidget.cellDoubleClicked.connect(self.jump_url_by_his)
        self.his_ui.label.setText(f'一共有<a style=color:{self.theme_color}>{row_num}</a>个历史记录,双击跳转')
        self. his_ui.show()

    # @pyqtSignal
    def jump_url_by_his(self,row,_):
        current_url=self.url_list[row]
        self.WebEngineView.setUrl(QUrl(current_url))
        self.his_ui.hide()

    def _fullScreenRequested(self,request):
        # self.WebEngineView.setParent(None, QtCore.Qt.Window)
        request.accept()
        self.WebEngineView.showFullScreen()
    #---历史记录end---


    #---主窗口事件

    def resizeEvent(self,event):
        x=self.geometry().x()+355
        y=self.geometry().y()+248
        if self.geometry().x()==0:
            self.message_ui.main_ui_size_change_single.emit(780, 412)
        else:
            self.message_ui.main_ui_size_change_single.emit(x,y)

    def moveEvent(self,event):
        x=self.geometry().x()+355
        y=self.geometry().y()+248
        if self.geometry().x()==0:
            self.message_ui.main_ui_size_change_single.emit(780, 412)
        else:
            self.message_ui.main_ui_size_change_single.emit(x,y)

    def closeEvent(self, event):
        ret =QMessageBox.question(self,'退出','您确定要退出吗?',QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
        if ret==QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

if __name__ == '__main__':
    #需要单独打开一个浏览器
    #os.environ["QTWEBENGINE_REMOTE_DEBUGGING"] = "9000"
    os.environ['QTWEBKIT_PLUGIN_PATH'] = os.path.abspath('Data')
    app=QApplication(sys.argv)
    ui=My_Web_Broswer()
    ui.show()
    sys.exit(app.exec_())

2.liulanqi.py(浏览器UI窗口)

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets


class Web_browser_Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1107, 754)
        MainWindow.setStyleSheet("QProgressBar {   \n"
"text-align: center;\n"
"border: 2px solid grey;   \n"
"border-radius: 5px;   \n"
"background-color: #FFFFFF;}\n"
"QProgressBar::chunk {   \n"
"background-color: #007FFF;\n"
"width: 1px;\n"
"background-color:rgb(255, 0, 255);\n"
"}\n"
"QPushButton {\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    padding: 1px 4px;\n"
"    min-width: 80px;\n"
"    min-height: 20px;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
"    border-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"\n"
"QCheckBox:hover{\n"
"    background-colorrgb(255, 170, 255);\n"
"\n"
"}\n"
"\n"
"QLineEdit{\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    selection-background-color:rgb(255, 170, 127);\n"
"    border: 1px solid;\n"
"    border-style: inset;\n"
"}\n"
"QLineEdit:hover{\n"
"    border-color:rgb(255, 170, 255);\n"
"}\n"
"QLineEdit:focus{\n"
"    border-color: rgb(0, 170, 255);\n"
"}\n"
"\n"
"QLabel {\n"
"    background: transparent;\n"
"    border: 1px solid transparent;\n"
"    padding: 1px;\n"
"}\n"
"QComboBox{\n"
"    margin:2px;\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color:rgb(0, 0, 0);\n"
"    min-width: 60px;\n"
"    min-height: 23px;\n"
"    max-width: 200px;\n"
"    max-height: 23px;\n"
"}\n"
"QComboBox:hover{\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"QToolBar{\n"
"    margin:2px;\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color: rgb(0, 0, 0);\n"
"\n"
"}\n"
"QToolBar:hover{\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"\n"
"\n"
"QGroupBox {\n"
"    background-color: rgb(255, 255, 255);\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    margin-top:1em;\n"
"}\n"
"QGroupBox::title {\n"
"    subcontrol-origin: margin;\n"
"    subcontrol-position: top left;\n"
"    top: 0.1em;\n"
"    background-color: rgb(255, 170, 255);\n"
"font-size:10px\n"
"}\n"
"")
        MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.progressBar_load_progress = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar_load_progress.setMaximumSize(QtCore.QSize(16777215, 5))
        self.progressBar_load_progress.setStyleSheet("")
        self.progressBar_load_progress.setProperty("value", 0)
        self.progressBar_load_progress.setTextVisible(False)
        self.progressBar_load_progress.setFormat("")
        self.progressBar_load_progress.setObjectName("progressBar_load_progress")
        self.verticalLayout.addWidget(self.progressBar_load_progress)
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.verticalLayout.addWidget(self.frame)
        self.progressBar_download_progress = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar_download_progress.setMaximumSize(QtCore.QSize(16777215, 10))
        self.progressBar_download_progress.setStyleSheet("QProgressBar {   \n"
"text-align: center;\n"
"border: 2px solid grey;   \n"
"border-radius: 5px;   \n"
"background-color: #FFFFFF;}\n"
"QProgressBar::chunk {   \n"
"background-color: #007FFF;\n"
"width: 5px;\n"
"background-color:rgb(179, 243, 83);\n"
"}")
        self.progressBar_download_progress.setProperty("value", 0)
        self.progressBar_download_progress.setTextVisible(False)
        self.progressBar_download_progress.setFormat("")
        self.progressBar_download_progress.setObjectName("progressBar_download_progress")
        self.verticalLayout.addWidget(self.progressBar_download_progress)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1107, 26))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menu_2 = QtWidgets.QMenu(self.menubar)
        self.menu_2.setObjectName("menu_2")
        self.menu_3 = QtWidgets.QMenu(self.menubar)
        self.menu_3.setObjectName("menu_3")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.action_houtui = QtWidgets.QAction(MainWindow)
        self.action_houtui.setCheckable(False)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("icons/houtui.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_houtui.setIcon(icon)
        self.action_houtui.setObjectName("action_houtui")
        self.action_qianjin = QtWidgets.QAction(MainWindow)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("icons/qianjin.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_qianjin.setIcon(icon1)
        self.action_qianjin.setObjectName("action_qianjin")
        self.action_shuaxin = QtWidgets.QAction(MainWindow)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("icons/shuaxin.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_shuaxin.setIcon(icon2)
        self.action_shuaxin.setObjectName("action_shuaxin")
        self.action_tingzhi = QtWidgets.QAction(MainWindow)
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("icons/tingzhi.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_tingzhi.setIcon(icon3)
        self.action_tingzhi.setObjectName("action_tingzhi")
        self.action_tuichu = QtWidgets.QAction(MainWindow)
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("icons/quit.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_tuichu.setIcon(icon4)
        self.action_tuichu.setObjectName("action_tuichu")
        self.action_about_author = QtWidgets.QAction(MainWindow)
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap("icons/about_author.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_about_author.setIcon(icon5)
        self.action_about_author.setObjectName("action_about_author")
        self.action_about_software = QtWidgets.QAction(MainWindow)
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap("icons/about_software.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_about_software.setIcon(icon6)
        self.action_about_software.setObjectName("action_about_software")
        self.action_daozhuye = QtWidgets.QAction(MainWindow)
        icon7 = QtGui.QIcon()
        icon7.addPixmap(QtGui.QPixmap("icons/zhuye.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_daozhuye.setIcon(icon7)
        self.action_daozhuye.setObjectName("action_daozhuye")
        self.action_collect = QtWidgets.QAction(MainWindow)
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap("icons/shoucang.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_collect.setIcon(icon8)
        self.action_collect.setObjectName("action_collect")
        self.action_lishi = QtWidgets.QAction(MainWindow)
        icon9 = QtGui.QIcon()
        icon9.addPixmap(QtGui.QPixmap("icons/lishi.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_lishi.setIcon(icon9)
        self.action_lishi.setObjectName("action_lishi")
        self.action_main_set = QtWidgets.QAction(MainWindow)
        icon10 = QtGui.QIcon()
        icon10.addPixmap(QtGui.QPixmap("icons/shezhi.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_main_set.setIcon(icon10)
        self.action_main_set.setObjectName("action_main_set")
        self.action_guanyv = QtWidgets.QAction(MainWindow)
        icon11 = QtGui.QIcon()
        icon11.addPixmap(QtGui.QPixmap("icons/xinxi.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_guanyv.setIcon(icon11)
        self.action_guanyv.setObjectName("action_guanyv")
        self.action_fangda = QtWidgets.QAction(MainWindow)
        icon12 = QtGui.QIcon()
        icon12.addPixmap(QtGui.QPixmap("icons/fangda.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_fangda.setIcon(icon12)
        self.action_fangda.setObjectName("action_fangda")
        self.action_suoxiao = QtWidgets.QAction(MainWindow)
        icon13 = QtGui.QIcon()
        icon13.addPixmap(QtGui.QPixmap("icons/suoxiao.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_suoxiao.setIcon(icon13)
        self.action_suoxiao.setObjectName("action_suoxiao")
        self.action_copy_current_link = QtWidgets.QAction(MainWindow)
        icon14 = QtGui.QIcon()
        icon14.addPixmap(QtGui.QPixmap("icons/copy_link.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_copy_current_link.setIcon(icon14)
        self.action_copy_current_link.setObjectName("action_copy_current_link")
        self.action_my_collection = QtWidgets.QAction(MainWindow)
        icon15 = QtGui.QIcon()
        icon15.addPixmap(QtGui.QPixmap("icons/my_collection.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_my_collection.setIcon(icon15)
        self.action_my_collection.setObjectName("action_my_collection")
        self.action_about_qt = QtWidgets.QAction(MainWindow)
        icon16 = QtGui.QIcon()
        icon16.addPixmap(QtGui.QPixmap("icons/qt_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_about_qt.setIcon(icon16)
        self.action_about_qt.setObjectName("action_about_qt")
        self.action_screen_shot = QtWidgets.QAction(MainWindow)
        icon17 = QtGui.QIcon()
        icon17.addPixmap(QtGui.QPixmap("icons/screen_shot.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.action_screen_shot.setIcon(icon17)
        self.action_screen_shot.setObjectName("action_screen_shot")
        self.menu.addSeparator()
        self.menu.addAction(self.action_tuichu)
        self.menu_2.addAction(self.action_daozhuye)
        self.menu_3.addAction(self.action_about_author)
        self.menu_3.addAction(self.action_about_software)
        self.menu_3.addAction(self.action_about_qt)
        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menu_2.menuAction())
        self.menubar.addAction(self.menu_3.menuAction())
        self.toolBar.addAction(self.action_houtui)
        self.toolBar.addAction(self.action_qianjin)
        self.toolBar.addAction(self.action_shuaxin)
        self.toolBar.addAction(self.action_tingzhi)
        self.toolBar.addAction(self.action_daozhuye)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.action_main_set)
        self.toolBar.addAction(self.action_copy_current_link)
        self.toolBar.addAction(self.action_screen_shot)
        self.toolBar.addAction(self.action_fangda)
        self.toolBar.addAction(self.action_suoxiao)
        self.toolBar.addAction(self.action_collect)
        self.toolBar.addAction(self.action_my_collection)
        self.toolBar.addAction(self.action_lishi)
        self.toolBar.addAction(self.action_guanyv)
        self.toolBar.addSeparator()

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "转到"))
        self.menu.setTitle(_translate("MainWindow", "开始"))
        self.menu_2.setTitle(_translate("MainWindow", "操作"))
        self.menu_3.setTitle(_translate("MainWindow", "关于"))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
        self.toolBar.setToolTip(_translate("MainWindow", "百度一下,你就知道"))
        self.action_houtui.setText(_translate("MainWindow", "后退"))
        self.action_qianjin.setText(_translate("MainWindow", "前进"))
        self.action_shuaxin.setText(_translate("MainWindow", "刷新"))
        self.action_tingzhi.setText(_translate("MainWindow", "停止"))
        self.action_tuichu.setText(_translate("MainWindow", "退出"))
        self.action_about_author.setText(_translate("MainWindow", "关于作者"))
        self.action_about_author.setIconText(_translate("MainWindow", "关于作者"))
        self.action_about_software.setText(_translate("MainWindow", "关于软件"))
        self.action_daozhuye.setText(_translate("MainWindow", "主页"))
        self.action_daozhuye.setToolTip(_translate("MainWindow", "到主页"))
        self.action_collect.setText(_translate("MainWindow", "收藏"))
        self.action_collect.setToolTip(_translate("MainWindow", "收藏"))
        self.action_lishi.setText(_translate("MainWindow", "历史"))
        self.action_lishi.setToolTip(_translate("MainWindow", "浏览历史"))
        self.action_main_set.setText(_translate("MainWindow", "设置"))
        self.action_main_set.setIconText(_translate("MainWindow", "设置"))
        self.action_guanyv.setText(_translate("MainWindow", "关于"))
        self.action_fangda.setText(_translate("MainWindow", "网页放大"))
        self.action_suoxiao.setText(_translate("MainWindow", "网页缩小"))
        self.action_copy_current_link.setText(_translate("MainWindow", "复制链接"))
        self.action_my_collection.setText(_translate("MainWindow", "我的收藏"))
        self.action_about_qt.setText(_translate("MainWindow", "关于QT"))
        self.action_screen_shot.setText(_translate("MainWindow", "网页截图"))
        self.action_screen_shot.setToolTip(_translate("MainWindow", "网页截图"))
import main_resource

3.main_set.py(设置窗口)

# -*- coding: utf-8 -*-


from PyQt5 import QtCore, QtGui, QtWidgets


class Main_set_Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
        Dialog.resize(723, 551)
        Dialog.setStyleSheet("QPushButton {\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    padding: 1px 4px;\n"
"    min-width: 80px;\n"
"    min-height: 20px;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
"    border-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"\n"
"QCheckBox:hover{\n"
"    background-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"\n"
"QLineEdit{\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    selection-background-color:rgb(255, 170, 127);\n"
"    border: 1px solid;\n"
"    border-style: inset;\n"
"}\n"
"QLineEdit:hover{\n"
"    border-color:rgb(255, 170, 255);\n"
"}\n"
"QLineEdit:focus{\n"
"    border-color: rgb(0, 170, 255);\n"
"}\n"
"\n"
"QLabel {\n"
"    background: transparent;\n"
"    border: 1px solid transparent;\n"
"    padding: 1px;\n"
"}\n"
"QComboBox{\n"
"    margin:2px;\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color:rgb(0, 0, 0);\n"
"    min-width: 60px;\n"
"    min-height: 23px;\n"
"    max-width: 200px;\n"
"    max-height: 23px;\n"
"}\n"
"QComboBox:hover{\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"QToolBar{\n"
"    margin:2px;\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color: rgb(0, 0, 0);\n"
"\n"
"}\n"
"QToolBar:hover{\n"
"    background-color:rgb(255, 255, 255);\n"
"    border-color:rgb(255, 170, 255);\n"
"\n"
"}\n"
"\n"
"\n"
"QGroupBox {\n"
"    background-color: rgb(255, 255, 255);\n"
"    border: 1px solid ;\n"
"    border-radius: 4px;\n"
"    margin-top:1em;\n"
"}\n"
"QGroupBox::title {\n"
"    subcontrol-origin: margin;\n"
"    subcontrol-position: top left;\n"
"    top: 0.1em;\n"
"    background-color: rgb(255, 170, 255);\n"
"font-size:10px\n"
"}\n"
"")
        self.horizontalLayout_14 = QtWidgets.QHBoxLayout(Dialog)
        self.horizontalLayout_14.setObjectName("horizontalLayout_14")
        self.tabWidget = QtWidgets.QTabWidget(Dialog)
        self.tabWidget.setEnabled(True)
        self.tabWidget.setAcceptDrops(False)
        self.tabWidget.setStyleSheet("")
        self.tabWidget.setTabPosition(QtWidgets.QTabWidget.West)
        self.tabWidget.setElideMode(QtCore.Qt.ElideLeft)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.tab)
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox_2 = QtWidgets.QGroupBox(self.tab)
        self.groupBox_2.setObjectName("groupBox_2")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.groupBox_2)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_3 = QtWidgets.QLabel(self.groupBox_2)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout.addWidget(self.label_3)
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox_2)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.horizontalLayout_4.addLayout(self.horizontalLayout)
        self.verticalLayout.addWidget(self.groupBox_2)
        self.groupBox = QtWidgets.QGroupBox(self.tab)
        self.groupBox.setObjectName("groupBox")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setObjectName("label")
        self.horizontalLayout_2.addWidget(self.label)
        self.comboBox = QtWidgets.QComboBox(self.groupBox)
        self.comboBox.setObjectName("comboBox")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("icons/baidu_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox.addItem(icon, "")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("icons/sougou_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox.addItem(icon1, "")
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("icons/google_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox.addItem(icon2, "")
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("icons/360_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox.addItem(icon3, "")
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("icons/bing_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox.addItem(icon4, "")
        self.horizontalLayout_2.addWidget(self.comboBox)
        self.horizontalLayout_3.addLayout(self.horizontalLayout_2)
        self.verticalLayout.addWidget(self.groupBox)
        self.groupBox_12 = QtWidgets.QGroupBox(self.tab)
        self.groupBox_12.setObjectName("groupBox_12")
        self.horizontalLayout_15 = QtWidgets.QHBoxLayout(self.groupBox_12)
        self.horizontalLayout_15.setObjectName("horizontalLayout_15")
        self.horizontalLayout_20 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_20.setObjectName("horizontalLayout_20")
        self.label_4 = QtWidgets.QLabel(self.groupBox_12)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_20.addWidget(self.label_4)
        self.comboBox_5 = QtWidgets.QComboBox(self.groupBox_12)
        self.comboBox_5.setObjectName("comboBox_5")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.comboBox_5.addItem("")
        self.horizontalLayout_20.addWidget(self.comboBox_5)
        self.horizontalLayout_15.addLayout(self.horizontalLayout_20)
        self.verticalLayout.addWidget(self.groupBox_12)
        self.verticalLayout.setStretch(0, 2)
        self.verticalLayout.setStretch(1, 2)
        self.verticalLayout.setStretch(2, 4)
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.tab_2)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.groupBox_3 = QtWidgets.QGroupBox(self.tab_2)
        self.groupBox_3.setObjectName("groupBox_3")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_3)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_6 = QtWidgets.QLabel(self.groupBox_3)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_6.addWidget(self.label_6)
        self.label_7 = QtWidgets.QLabel(self.groupBox_3)
        self.label_7.setObjectName("label_7")
        self.horizontalLayout_6.addWidget(self.label_7)
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_3)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_6.addWidget(self.pushButton_2)
        self.verticalLayout_2.addLayout(self.horizontalLayout_6)
        self.verticalLayout_6.addWidget(self.groupBox_3)
        self.groupBox_8 = QtWidgets.QGroupBox(self.tab_2)
        self.groupBox_8.setObjectName("groupBox_8")
        self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.groupBox_8)
        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
        self.comboBox_2 = QtWidgets.QComboBox(self.groupBox_8)
        self.comboBox_2.setMinimumSize(QtCore.QSize(66, 29))
        self.comboBox_2.setMaximumSize(QtCore.QSize(206, 29))
        self.comboBox_2.setStyleSheet("")
        self.comboBox_2.setObjectName("comboBox_2")
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap("icons/windows_nt_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox_2.addItem(icon5, "")
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap("icons/android_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox_2.addItem(icon6, "")
        icon7 = QtGui.QIcon()
        icon7.addPixmap(QtGui.QPixmap("icons/iphone_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox_2.addItem(icon7, "")
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap("icons/ipad_logo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.comboBox_2.addItem(icon8, "")
        self.horizontalLayout_13.addWidget(self.comboBox_2)
        self.verticalLayout_6.addWidget(self.groupBox_8)
        self.groupBox_5 = QtWidgets.QGroupBox(self.tab_2)
        self.groupBox_5.setObjectName("groupBox_5")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_5)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        self.label_9 = QtWidgets.QLabel(self.groupBox_5)
        self.label_9.setObjectName("label_9")
        self.horizontalLayout_8.addWidget(self.label_9)
        self.comboBox_3 = QtWidgets.QComboBox(self.groupBox_5)
        self.comboBox_3.setObjectName("comboBox_3")
        self.comboBox_3.addItem("")
        self.comboBox_3.addItem("")
        self.horizontalLayout_8.addWidget(self.comboBox_3)
        self.verticalLayout_4.addLayout(self.horizontalLayout_8)
        self.horizontalLayout_16 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_16.setObjectName("horizontalLayout_16")
        self.label_16 = QtWidgets.QLabel(self.groupBox_5)
        self.label_16.setObjectName("label_16")
        self.horizontalLayout_16.addWidget(self.label_16)
        self.comboBox_4 = QtWidgets.QComboBox(self.groupBox_5)
        self.comboBox_4.setObjectName("comboBox_4")
        self.comboBox_4.addItem("")
        self.comboBox_4.addItem("")
        self.horizontalLayout_16.addWidget(self.comboBox_4)
        self.verticalLayout_4.addLayout(self.horizontalLayout_16)
        self.verticalLayout_6.addWidget(self.groupBox_5)
        self.groupBox_9 = QtWidgets.QGroupBox(self.tab_2)
        self.groupBox_9.setObjectName("groupBox_9")
        self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.groupBox_9)
        self.verticalLayout_9.setObjectName("verticalLayout_9")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.checkBox = QtWidgets.QCheckBox(self.groupBox_9)
        self.checkBox.setObjectName("checkBox")
        self.horizontalLayout_5.addWidget(self.checkBox)
        self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox_9)
        self.checkBox_2.setObjectName("checkBox_2")
        self.horizontalLayout_5.addWidget(self.checkBox_2)
        self.checkBox_3 = QtWidgets.QCheckBox(self.groupBox_9)
        self.checkBox_3.setObjectName("checkBox_3")
        self.horizontalLayout_5.addWidget(self.checkBox_3)
        self.checkBox_4 = QtWidgets.QCheckBox(self.groupBox_9)
        self.checkBox_4.setObjectName("checkBox_4")
        self.horizontalLayout_5.addWidget(self.checkBox_4)
        self.verticalLayout_9.addLayout(self.horizontalLayout_5)
        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.checkBox_5 = QtWidgets.QCheckBox(self.groupBox_9)
        self.checkBox_5.setObjectName("checkBox_5")
        self.verticalLayout_5.addWidget(self.checkBox_5)
        self.verticalLayout_9.addLayout(self.verticalLayout_5)
        self.groupBox_10 = QtWidgets.QGroupBox(self.groupBox_9)
        self.groupBox_10.setObjectName("groupBox_10")
        self.horizontalLayout_18 = QtWidgets.QHBoxLayout(self.groupBox_10)
        self.horizontalLayout_18.setObjectName("horizontalLayout_18")
        self.checkBox_6 = QtWidgets.QCheckBox(self.groupBox_10)
        self.checkBox_6.setObjectName("checkBox_6")
        self.horizontalLayout_18.addWidget(self.checkBox_6)
        self.label_18 = QtWidgets.QLabel(self.groupBox_10)
        self.label_18.setObjectName("label_18")
        self.horizontalLayout_18.addWidget(self.label_18)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.groupBox_10)
        self.lineEdit_5.setEnabled(False)
        self.lineEdit_5.setMinimumSize(QtCore.QSize(80, 0))
        self.lineEdit_5.setMaximumSize(QtCore.QSize(80, 16777215))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.horizontalLayout_18.addWidget(self.lineEdit_5)
        self.pushButton_8 = QtWidgets.QPushButton(self.groupBox_10)
        self.pushButton_8.setEnabled(False)
        self.pushButton_8.setObjectName("pushButton_8")
        self.horizontalLayout_18.addWidget(self.pushButton_8)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_18.addItem(spacerItem)
        self.verticalLayout_9.addWidget(self.groupBox_10)
        self.groupBox_11 = QtWidgets.QGroupBox(self.groupBox_9)
        self.groupBox_11.setObjectName("groupBox_11")
        self.horizontalLayout_19 = QtWidgets.QHBoxLayout(self.groupBox_11)
        self.horizontalLayout_19.setObjectName("horizontalLayout_19")
        self.checkBox_7 = QtWidgets.QCheckBox(self.groupBox_11)
        self.checkBox_7.setObjectName("checkBox_7")
        self.horizontalLayout_19.addWidget(self.checkBox_7)
        self.label_20 = QtWidgets.QLabel(self.groupBox_11)
        self.label_20.setObjectName("label_20")
        self.horizontalLayout_19.addWidget(self.label_20)
        self.lineEdit_6 = QtWidgets.QLineEdit(self.groupBox_11)
        self.lineEdit_6.setEnabled(False)
        self.lineEdit_6.setMinimumSize(QtCore.QSize(80, 0))
        self.lineEdit_6.setMaximumSize(QtCore.QSize(80, 16777215))
        self.lineEdit_6.setObjectName("lineEdit_6")
        self.horizontalLayout_19.addWidget(self.lineEdit_6)
        self.label_22 = QtWidgets.QLabel(self.groupBox_11)
        self.label_22.setObjectName("label_22")
        self.horizontalLayout_19.addWidget(self.label_22)
        self.lineEdit_7 = QtWidgets.QLineEdit(self.groupBox_11)
        self.lineEdit_7.setEnabled(False)
        self.lineEdit_7.setMinimumSize(QtCore.QSize(80, 0))
        self.lineEdit_7.setMaximumSize(QtCore.QSize(80, 16777215))
        self.lineEdit_7.setObjectName("lineEdit_7")
        self.horizontalLayout_19.addWidget(self.lineEdit_7)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_19.addItem(spacerItem1)
        self.verticalLayout_9.addWidget(self.groupBox_11)
        self.verticalLayout_6.addWidget(self.groupBox_9)
        self.verticalLayout_6.setStretch(0, 1)
        self.verticalLayout_6.setStretch(1, 1)
        self.verticalLayout_6.setStretch(2, 2)
        self.verticalLayout_6.setStretch(3, 3)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab_3)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.groupBox_6 = QtWidgets.QGroupBox(self.tab_3)
        self.groupBox_6.setObjectName("groupBox_6")
        self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.groupBox_6)
        self.verticalLayout_8.setObjectName("verticalLayout_8")
        self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
        self.label_2 = QtWidgets.QLabel(self.groupBox_6)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_9.addWidget(self.label_2)
        self.label_15 = QtWidgets.QLabel(self.groupBox_6)
        self.label_15.setObjectName("label_15")
        self.horizontalLayout_9.addWidget(self.label_15)
        self.pushButton_4 = QtWidgets.QPushButton(self.groupBox_6)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout_9.addWidget(self.pushButton_4)
        self.verticalLayout_8.addLayout(self.horizontalLayout_9)
        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
        self.label_10 = QtWidgets.QLabel(self.groupBox_6)
        self.label_10.setObjectName("label_10")
        self.horizontalLayout_10.addWidget(self.label_10)
        self.label_13 = QtWidgets.QLabel(self.groupBox_6)
        self.label_13.setObjectName("label_13")
        self.horizontalLayout_10.addWidget(self.label_13)
        self.pushButton_5 = QtWidgets.QPushButton(self.groupBox_6)
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout_10.addWidget(self.pushButton_5)
        self.verticalLayout_8.addLayout(self.horizontalLayout_10)
        self.groupBox_7 = QtWidgets.QGroupBox(self.groupBox_6)
        self.groupBox_7.setObjectName("groupBox_7")
        self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.groupBox_7)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_11.setObjectName("horizontalLayout_11")
        self.label_11 = QtWidgets.QLabel(self.groupBox_7)
        self.label_11.setObjectName("label_11")
        self.horizontalLayout_11.addWidget(self.label_11)
        self.pushButton_6 = QtWidgets.QPushButton(self.groupBox_7)
        self.pushButton_6.setObjectName("pushButton_6")
        self.horizontalLayout_11.addWidget(self.pushButton_6)
        self.verticalLayout_7.addLayout(self.horizontalLayout_11)
        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
        self.label_12 = QtWidgets.QLabel(self.groupBox_7)
        self.label_12.setObjectName("label_12")
        self.horizontalLayout_12.addWidget(self.label_12)
        self.pushButton_7 = QtWidgets.QPushButton(self.groupBox_7)
        self.pushButton_7.setObjectName("pushButton_7")
        self.horizontalLayout_12.addWidget(self.pushButton_7)
        self.verticalLayout_7.addLayout(self.horizontalLayout_12)
        self.verticalLayout_8.addWidget(self.groupBox_7)
        self.verticalLayout_3.addWidget(self.groupBox_6)
        self.groupBox_4 = QtWidgets.QGroupBox(self.tab_3)
        self.groupBox_4.setObjectName("groupBox_4")
        self.horizontalLayout_21 = QtWidgets.QHBoxLayout(self.groupBox_4)
        self.horizontalLayout_21.setObjectName("horizontalLayout_21")
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.label_8 = QtWidgets.QLabel(self.groupBox_4)
        self.label_8.setObjectName("label_8")
        self.horizontalLayout_7.addWidget(self.label_8)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox_4)
        self.lineEdit_2.setReadOnly(True)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.horizontalLayout_7.addWidget(self.lineEdit_2)
        self.pushButton_3 = QtWidgets.QPushButton(self.groupBox_4)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_7.addWidget(self.pushButton_3)
        self.horizontalLayout_21.addLayout(self.horizontalLayout_7)
        self.verticalLayout_3.addWidget(self.groupBox_4)
        self.groupBox_13 = QtWidgets.QGroupBox(self.tab_3)
        self.groupBox_13.setObjectName("groupBox_13")
        self.horizontalLayout_22 = QtWidgets.QHBoxLayout(self.groupBox_13)
        self.horizontalLayout_22.setObjectName("horizontalLayout_22")
        self.horizontalLayout_23 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_23.setObjectName("horizontalLayout_23")
        self.label_21 = QtWidgets.QLabel(self.groupBox_13)
        self.label_21.setObjectName("label_21")
        self.horizontalLayout_23.addWidget(self.label_21)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.groupBox_13)
        self.lineEdit_3.setReadOnly(True)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.horizontalLayout_23.addWidget(self.lineEdit_3)
        self.pushButton_10 = QtWidgets.QPushButton(self.groupBox_13)
        self.pushButton_10.setObjectName("pushButton_10")
        self.horizontalLayout_23.addWidget(self.pushButton_10)
        self.horizontalLayout_22.addLayout(self.horizontalLayout_23)
        self.verticalLayout_3.addWidget(self.groupBox_13)
        self.tabWidget.addTab(self.tab_3, "")
        self.tab_4 = QtWidgets.QWidget()
        self.tab_4.setObjectName("tab_4")
        self.layoutWidget = QtWidgets.QWidget(self.tab_4)
        self.layoutWidget.setGeometry(QtCore.QRect(80, 170, 431, 211))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_17 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_17.setObjectName("horizontalLayout_17")
        self.label_14 = QtWidgets.QLabel(self.layoutWidget)
        self.label_14.setText("")
        self.label_14.setPixmap(QtGui.QPixmap("icons/head_img.png"))
        self.label_14.setObjectName("label_14")
        self.horizontalLayout_17.addWidget(self.label_14)
        self.label_17 = QtWidgets.QLabel(self.layoutWidget)
        self.label_17.setStyleSheet("QLabel{\n"
"    \n"
"    font: 16pt \"Arial\";\n"
"}")
        self.label_17.setTextFormat(QtCore.Qt.MarkdownText)
        self.label_17.setOpenExternalLinks(True)
        self.label_17.setObjectName("label_17")
        self.horizontalLayout_17.addWidget(self.label_17)
        self.label_19 = QtWidgets.QLabel(self.tab_4)
        self.label_19.setGeometry(QtCore.QRect(60, 30, 461, 131))
        self.label_19.setObjectName("label_19")
        self.tabWidget.addTab(self.tab_4, "")
        self.horizontalLayout_14.addWidget(self.tabWidget)

        self.retranslateUi(Dialog)
        self.tabWidget.setCurrentIndex(0)
        self.comboBox_5.setCurrentIndex(3)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "设置"))
        self.groupBox_2.setTitle(_translate("Dialog", "主页"))
        self.label_3.setText(_translate("Dialog", "主页地址"))
        self.groupBox.setTitle(_translate("Dialog", "搜索引擎"))
        self.label.setText(_translate("Dialog", "地址栏中的搜索引擎"))
        self.comboBox.setItemText(0, _translate("Dialog", "百度"))
        self.comboBox.setItemText(1, _translate("Dialog", "搜狗"))
        self.comboBox.setItemText(2, _translate("Dialog", "Google"))
        self.comboBox.setItemText(3, _translate("Dialog", "360"))
        self.comboBox.setItemText(4, _translate("Dialog", "Bing"))
        self.groupBox_12.setTitle(_translate("Dialog", "网页缩放"))
        self.label_4.setText(_translate("Dialog", "网页缩放比例"))
        self.comboBox_5.setCurrentText(_translate("Dialog", "100%"))
        self.comboBox_5.setItemText(0, _translate("Dialog", "30%"))
        self.comboBox_5.setItemText(1, _translate("Dialog", "50%"))
        self.comboBox_5.setItemText(2, _translate("Dialog", "80%"))
        self.comboBox_5.setItemText(3, _translate("Dialog", "100%"))
        self.comboBox_5.setItemText(4, _translate("Dialog", "120%"))
        self.comboBox_5.setItemText(5, _translate("Dialog", "150%"))
        self.comboBox_5.setItemText(6, _translate("Dialog", "180%"))
        self.comboBox_5.setItemText(7, _translate("Dialog", "200%"))
        self.comboBox_5.setItemText(8, _translate("Dialog", "250%"))
        self.comboBox_5.setItemText(9, _translate("Dialog", "300%"))
        self.comboBox_5.setItemText(10, _translate("Dialog", "400%"))
        self.comboBox_5.setItemText(11, _translate("Dialog", "500%"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Dialog", "基本"))
        self.groupBox_3.setTitle(_translate("Dialog", "颜色"))
        self.label_6.setText(_translate("Dialog", "主题颜色"))
        self.label_7.setText(_translate("Dialog", "<html><head/><body><p><span style=\" color:#ffaaff;\">主题颜色</span></p></body></html>"))
        self.pushButton_2.setText(_translate("Dialog", "更改颜色"))
        self.groupBox_8.setTitle(_translate("Dialog", "UA"))
        self.comboBox_2.setItemText(0, _translate("Dialog", "Windows电脑"))
        self.comboBox_2.setItemText(1, _translate("Dialog", "安卓手机"))
        self.comboBox_2.setItemText(2, _translate("Dialog", "苹果手机"))
        self.comboBox_2.setItemText(3, _translate("Dialog", "IPad"))
        self.groupBox_5.setTitle(_translate("Dialog", "语言"))
        self.label_9.setText(_translate("Dialog", "系统语言(未实现)"))
        self.comboBox_3.setItemText(0, _translate("Dialog", "Chinese(简体中文)"))
        self.comboBox_3.setItemText(1, _translate("Dialog", "English"))
        self.label_16.setText(_translate("Dialog", "编码"))
        self.comboBox_4.setItemText(0, _translate("Dialog", "iso-8859-1"))
        self.comboBox_4.setItemText(1, _translate("Dialog", "utf-8"))
        self.groupBox_9.setTitle(_translate("Dialog", "其他"))
        self.checkBox.setText(_translate("Dialog", "启用拼写检查"))
        self.checkBox_2.setText(_translate("Dialog", "启用空间导航"))
        self.checkBox_3.setText(_translate("Dialog", "启用全局证书验证"))
        self.checkBox_4.setText(_translate("Dialog", "允许非安全来源访问地理定位"))
        self.checkBox_5.setText(_translate("Dialog", "忽略证书错误(不安全)"))
        self.groupBox_10.setTitle(_translate("Dialog", "调试"))
        self.checkBox_6.setText(_translate("Dialog", "启用调试(未实现)"))
        self.label_18.setText(_translate("Dialog", "调试端口:"))
        self.lineEdit_5.setText(_translate("Dialog", "6688"))
        self.pushButton_8.setText(_translate("Dialog", "打开调试页面"))
        self.groupBox_11.setTitle(_translate("Dialog", "代理"))
        self.checkBox_7.setText(_translate("Dialog", "启用代理(未实现)"))
        self.label_20.setText(_translate("Dialog", "IP:"))
        self.lineEdit_6.setText(_translate("Dialog", "127.0.0.1"))
        self.label_22.setText(_translate("Dialog", "端口:"))
        self.lineEdit_7.setText(_translate("Dialog", "6688"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Dialog", "个性"))
        self.groupBox_6.setTitle(_translate("Dialog", "清理记录"))
        self.label_2.setText(_translate("Dialog", "浏览历史"))
        self.label_15.setText(_translate("Dialog", "一共存在个历史记录"))
        self.pushButton_4.setText(_translate("Dialog", "清空浏览记录"))
        self.label_10.setText(_translate("Dialog", "缓存"))
        self.label_13.setText(_translate("Dialog", "一共产生了M的缓存"))
        self.pushButton_5.setText(_translate("Dialog", "清空缓存"))
        self.groupBox_7.setTitle(_translate("Dialog", "cookie"))
        self.label_11.setText(_translate("Dialog", "cookie"))
        self.pushButton_6.setText(_translate("Dialog", "清空cookie"))
        self.label_12.setText(_translate("Dialog", "会话cookie"))
        self.pushButton_7.setText(_translate("Dialog", "清空会话cookie"))
        self.groupBox_4.setTitle(_translate("Dialog", "下载"))
        self.label_8.setText(_translate("Dialog", "默认下载位置"))
        self.pushButton_3.setText(_translate("Dialog", "更改位置"))
        self.groupBox_13.setTitle(_translate("Dialog", "截图"))
        self.label_21.setText(_translate("Dialog", "截图保存位置"))
        self.pushButton_10.setText(_translate("Dialog", "更改位置"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("Dialog", "隐私"))
        self.label_17.setText(_translate("Dialog", "<html><head/><body><p>作者:懷淰メ</p><p>By:PyQt5</p><p><a href=\"https://blog.csdn.net/a1397852386\"><span style=\" text-decoration: underline; color:#0000ff;\">作者主页</span></a></p></body></html>"))
        self.label_19.setText(_translate("Dialog", "<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:600; color:#00aa7f;\">青青子衿,悠悠我心。</span></p><p align=\"center\"><span style=\" font-size:16pt; font-weight:600; color:#00aa7f;\">但为君故,沉吟至今。</span></p></body></html>"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("Dialog", "关于"))
import main_resource

4.history.py(浏览历史)

from PyQt5 import QtCore, QtGui, QtWidgets


class History_Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setWindowModality(QtCore.Qt.ApplicationModal)
        Form.resize(450, 600)
        Form.setMaximumSize(QtCore.QSize(450, 600))
        Form.setStyleSheet("")
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(Form)
        self.tableWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tableWidget.setGridStyle(QtCore.Qt.DashLine)
        self.tableWidget.setWordWrap(False)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(50)
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        self.tableWidget.verticalHeader().setVisible(True)
        self.tableWidget.verticalHeader().setStretchLastSection(False)
        self.verticalLayout.addWidget(self.tableWidget)
        self.label = QtWidgets.QLabel(Form)
        self.label.setText("")
        self.label.setOpenExternalLinks(True)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "历史记录"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "地址"))

5.my_favourite.py(我的收藏)

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets


class Favourite_Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setWindowModality(QtCore.Qt.ApplicationModal)
        Form.resize(550, 600)
        Form.setMaximumSize(QtCore.QSize(550, 600))
        Form.setStyleSheet("")
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tableWidget = QtWidgets.QTableWidget(Form)
        self.tableWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
        self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.tableWidget.setGridStyle(QtCore.Qt.DashLine)
        self.tableWidget.setWordWrap(False)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(200)
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        self.tableWidget.verticalHeader().setVisible(True)
        self.tableWidget.verticalHeader().setStretchLastSection(False)
        self.verticalLayout.addWidget(self.tableWidget)
        self.label = QtWidgets.QLabel(Form)
        self.label.setText("")
        self.label.setOpenExternalLinks(True)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "我的收藏"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("Form", "时间"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("Form", "地址"))

6.window_zoom.py(窗口消息显示)

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

from PyQt5.QtCore import *

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(Form)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
        self.timer = QTimer(self)  # 初始化一个定时器
        self.timer.timeout.connect(self.close)  # 计时结束调用operate()方法
        self.timer.start(3000)  # 设置计时间隔并启动 3s后关闭窗口

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "<html><head/><body><p align=\"center\"><span style=\" font-size:18pt; color:#1d15ff;\">当前缩放比例</span></p></body></html>"))

7.utils.py(辅助工具)

import os
import time

class Util:

    def read_txt(self,txt_file):
        try:
            with open(txt_file,'r',encoding='utf-8')as f:
                data=f.readlines()
            return data
        except:
            open(txt_file,'w',encoding='utf-8')

    def get_time_string(self):
        """
        获取时间字符串
        :return: 时间字符串
        """
        timestamp = time.time()
        timestruct = time.localtime(timestamp)
        time_string = time.strftime('%Y-%m-%d %H:%M:%S', timestruct)
        return time_string

    def write_to_txt(self,txt_file,line):
        try:
            with open(txt_file,'a',encoding='utf-8')as f:
                f.write(line)
        except:
            return False

    def format_size(self, bytes):
        try:
            bytes = float(bytes)
            kb = bytes / 1024
            if kb > 1024:
                mb = kb / 1024
                if mb > 1024:
                    gb = mb / 1024
                    return '%.2fGB' % gb
                else:
                    return '%.2fMB' % mb
            else:
                return '%.2fKB' % kb
        except:
            return 'error'


8.main_resource.qrc(QT设计师使用资源文件)

<RCC>
  <qresource prefix="action_icon">
    <file>icons/screen_shot.ico</file>
    <file>icons/about_author.ico</file>
    <file>icons/about_software.ico</file>
    <file>icons/quit.ico</file>
    <file>icons/xinxi.png</file>
    <file>icons/copy_link.ico</file>
    <file>icons/fangda.ico</file>
    <file>icons/houtui.png</file>
    <file>icons/my_collection.ico</file>
    <file>icons/qianjin.png</file>
    <file>icons/shezhi.png</file>
    <file>icons/shoucang.png</file>
    <file>icons/shuaxin.png</file>
    <file>icons/suoxiao.ico</file>
    <file>icons/tingzhi.png</file>
    <file>icons/xinxi.png</file>
    <file>icons/zhuye.png</file>
  </qresource>
  <qresource prefix="combobox_icon">
    <file>icons/android_logo.ico</file>
    <file>icons/iphone_logo.ico</file>
    <file>icons/windows_nt_logo.ico</file>
    <file>icons/ipad_logo.ico</file>
    <file>icons/360_logo.ico</file>
    <file>icons/android_logo.ico</file>
    <file>icons/baidu_logo.ico</file>
    <file>icons/bing_logo.ico</file>
    <file>icons/google_logo.ico</file>
    <file>icons/iphone_logo.ico</file>
    <file>icons/sougou_logo.ico</file>
    <file>icons/windows_nt_logo.ico</file>
  </qresource>
  <qresource prefix="author_img">
    <file>icons/head_img.png</file>
  </qresource>
</RCC>

五.总结

本次使用PyQt5制作了一款浏览器,基本实现了一般浏览器的功能,不过还是存在一些不足,例如:
1.所有网页跳转均在主窗口中进行,不支持多页显示和操作
2.不支持视频播放
3.设置里面的部分内容没有实现,比如:语言切换
4.网页收藏格式过于简单,只是文本文件操作,可以使用html格式,便于规范


在此,提出我的解决问题方案:
1.PyQt5中使用QTabwidget标签页,网页跳转时,创建新的标签页。可参考:

python PyQt QtWebEngine实现本窗口跳转+ 新窗口跳转

2.重新编译QtWebEngine。可参考:

解决QtWebEngine无法播放H5中的mp4

3.使用QtLinguist,逐个翻译。可参考:

PyQt5 pycharm配置(2)语言家QtLinguist

4.这个简单,使用Python自带的字符串处理函数,将title放在a标签里,将链接地址放在href中,最后存为.html格式
程序打包好放在了百度云中(密码:8888),欢迎各位使用、测试。思路、代码方面有什么不足欢迎各位大佬指正、批评!能点个赞给我个鼓励吗?
在这里插入图片描述

六.附录:开发记录

2021-10-10
1.设计UI界面,用浏览器填充整个窗口,设计菜单栏、工具栏
2.绑定浏览器事件以及对应函数
    (1)urlChanged:->show_jump_url(url)  展示“加载”进度条、将URL显示在输入框中
    (2)loadProgress:->show_load_progress(progress)  显示加载进度,设置窗口标题
    (3)loadFinished:->change_history_state()  改变“前进”,“后退”按钮状态
    (4)iconChanged:->lambda icon:self.setWindowIcon(icon)    设置窗口图标

2021-10-18
1.输入时,判断输入类型,根据输入类型改变按钮标题为“转到”或“搜索” textEdited:->judge_input(text)
2.尝试调用X度搜索建议,但是界面会闪退

2021-10-19
1.历史记录URL、title,绑定双击事件、清理缓存
2.收藏记录

2021-10-21
QSS整体主题皮肤设置

2021-10-23
设置
1.主页、默认搜索引擎
2.默认下载位置
3.UA
4.拼写检查、空间导航、全局证书验证
5.编码
6.调试

2021-10-24
1.主题颜色自定义
2.自定义窗口放大比例

2021-10-25
1.网页窗口截图
2.解决子窗口居中问题
3.解决两个标签颜色问题、进度条颜色问题

2021-10-30
1.下载功能
  • 17
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
【资源说明】 基于Pyqt5+Mysql开发的餐饮管理系统+数据库sql+项目说明(毕设源码).zip 开发功能如下: 一级功能 二级子功能 功能详述 员工管理 新增员工 添加新员工,填写员工基本信息。 修改员工 修改员工信息,包括姓名、联系方式、籍贯、等 删除员工 删除员工信息 查询员工 按照员工编号、姓名、性别等条件查询员工信息 员工登录 员工通过输入用户名和密码登录系统 菜品管理 新增菜品 添加新菜品,填写菜品基本信息、价格、数量、辣度等 修改菜品 修改菜品信息,包括名称、价格、辣度、数量、是否推荐等 删除菜品 删除菜品信息,同时删除与该菜品相关的订单信息 查询菜品列表 按照菜品编号、名称、价格等条件查询菜品信息 查看菜品详情 查看菜品详细信息,包括菜品名称、价格等 查询菜品销量 统计菜品销量信息。 点餐功能 点餐菜品 选择菜品以及数量进行下单 点餐付款 对下达订单进行付款 订单管理 删除订单 删除数据库中的订单 修改订单 修改数据库中的订单 新增订单 添加数据库中的订单 客户管理 新增客户 添加新客户,填写客户基本信息和联系方式 修改客户 修改客户信息,包括姓名、联系方式、身份证号、籍贯等 删除客户 删除客户信息。 查询客户列表 按照客户编号、姓名、性别等条件查询客户信息 客户登录 客户通过输入手机号和密码登录系统 库存管理 修改库存 修改库存信息,包括库存名称、数量等 删除库存 删除库存信息。 查询库存 按照库存编号、名称、等条件查询库存信息 新增库存 添加新库存,填写库存基本信息,包括库存名称、数量、存放位置等 报表生成功能 生成销售报表 生成统计销售额、销售量、菜品销售排名等信息的报表 生成收入报表 生成统计利润、成本等信息的报表 生成订单报表 生成统计订单数量等信息的报表 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
### 回答1: 学生宿舍管理系统是基于PythonPyQt5和MySQL开发的一个项目,旨在帮助学校高效管理学生宿舍的入住、退宿、维修等信息。下面是该项目的详细说明文档: 1. 系统功能 - 学生宿舍的入住管理:可以添加、删除、修改学生的宿舍信息,包括姓名、学号、宿舍楼号、宿舍号等内容。 - 学生宿舍的维修管理:可以记录宿舍的维修情况,包括宿舍号、维修日期、维修原因等信息,并能够查看历史维修记录。 - 学生宿舍的退宿管理:可以退宿学生,并更新宿舍的入住状态。 - 学生宿舍的查询功能:可以通过学号、宿舍楼号、宿舍号等信息,查询学生宿舍的相关信息。 2. 系统架构 - 前端界面使用PyQt5库实现,包括各个功能模块的界面设计。 - 后端数据存储使用MySQL数据库,存储学生宿舍的相关信息。 - Python作为开发语言,通过PyQt5库提供的方法与MySQL数据库进行交互。 3. 系统运行环境 - 操作系统:推荐使用Windows系统,也可以在Linux或Mac OS上运行。 - Python版本:推荐Python3.x版本。 - PyQt5安装:使用pip命令安装PyQt5库,pip install pyqt5。 - MySQL安装:安装MySQL数据库,并创建对应的数据库和表。 4. 运行方式 - 下载源码:从GitHub或其他源码托管平台下载学生宿舍管理系统的源码。 - 配置数据库:在源码中修改连接数据库的相关信息,包括MySQL的地址、用户名、密码等。 - 运行程序:通过Python命令运行主程序文件,即可启动系统界面。 - 页面操作:根据界面提供的按钮和输入框进行相应的添加、修改、删除、查询等操作。 5. 注意事项 - 由于本项目是基于PythonPyQt5开发的,需要对PythonGUI界面开发有一定的了解。 - 在使用该系统之前,需要创建对应的数据库和表,并将相关信息配置到源码中。 - 可以根据实际需要进行功能的扩展和修改,例如增加宿舍楼管理、学生信息管理等模块。 这个学生宿舍管理系统源码提供了一个简单易用的GUI界面,方便学校管理学生宿舍的各项信息,并且可以快速查询和统计宿舍相关数据,帮助学校实现宿舍管理的自动化和规范化。 ### 回答2: 学生宿舍管理系统是基于PythonPyQt5和MySQL实现的一款图形用户界面(GUI)应用程序。该系统旨在帮助学校管理学生宿舍的入住、退房和维护等事务。 系统的数据库设计如下: 1. 学生表(Student):包含学生的基本信息,如学号、姓名、性别、年龄等。 2. 宿舍楼表(DormitoryBuilding):记录宿舍楼的信息,如楼号、楼层数、可容纳人数等。 3. 宿舍房间表(DormitoryRoom):每个宿舍楼内包括多个宿舍房间,该表记录了宿舍房间的编号、所在楼号、可容纳人数等。 4. 入住记录表(CheckInRecord):记录学生的入住情况,包括入住日期、房间号、学生信息等。 系统的功能模块如下: 1. 学生管理:可以对学生的基本信息进行增加、删除、修改和查询操作。 2. 宿舍楼管理:可以对宿舍楼的信息进行增加、删除、修改和查询操作。 3. 宿舍房间管理:可以对宿舍房间的信息进行增加、删除、修改和查询操作。 4. 入住管理:可以对学生的入住情况进行登记、查询和退房操作。 5. 统计功能:可以统计宿舍楼的入住情况和宿舍房间的入住率。 系统的GUI界面采用PyQt5库进行开发,具有用户友好的操作界面,方便用户进行操作和管理。 总结起来,该学生宿舍管理系统使用Python编程语言PyQt5图形界面库和MySQL数据库,实现了学生、宿舍楼、宿舍房间和入住记录的管理功能,方便学校对学生宿舍的管理和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值