コード例 #1
0
ファイル: browser.py プロジェクト: rda0/web-greeter
class Browser(Application):
    # pylint: disable=too-many-instance-attributes
    """The main browser"""
    url_scheme: QWebEngineUrlScheme
    bridge_initialized: bool
    dev_view: QWebEngineView
    dev_page: WebPage
    qdock: QDockWidget

    def __init__(self):
        super().__init__()
        self.init()
        # self.load()

    def init(self):
        """Initialize browser"""
        logger.debug("Initializing Browser Window")

        if web_greeter_config["config"]["greeter"]["debug_mode"]:
            os.environ['QTWEBENGINE_REMOTE_DEBUGGING'] = '12345'

        url_scheme = "web-greeter"
        self.url_scheme = QWebEngineUrlScheme(url_scheme.encode())
        self.url_scheme.setDefaultPort(QWebEngineUrlScheme.PortUnspecified)
        self.url_scheme.setFlags(QWebEngineUrlScheme.SecureScheme
                                 or QWebEngineUrlScheme.LocalScheme
                                 or QWebEngineUrlScheme.LocalAccessAllowed)
        QWebEngineUrlScheme.registerScheme(self.url_scheme)

        self.profile = QWebEngineProfile.defaultProfile()
        self.interceptor = QtUrlRequestInterceptor(url_scheme)
        self.url_scheme_handler = QtUrlSchemeHandler()

        self.view = QWebEngineView(parent=self.window)
        self.page = WebPage()
        self.view.setPage(self.page)
        self.page.setObjectName("WebG Page")
        self.view.setObjectName("WebG View")

        self.channel = QWebChannel(self.page)
        self.bridge_initialized = False

        self.profile.installUrlSchemeHandler(url_scheme.encode(),
                                             self.url_scheme_handler)

        self._initialize_page()

        if web_greeter_config["config"]["greeter"]["debug_mode"]:
            self._initialize_devtools()
        else:
            self.view.setContextMenuPolicy(Qt.PreventContextMenu)

        self._init_actions()
        if web_greeter_config["app"]["frame"]:
            self._init_menu_bar()
        else:
            self.window.setWindowFlags(self.window.windowFlags()
                                       | Qt.FramelessWindowHint)

        if web_greeter_config["config"]["greeter"]["secure_mode"]:
            if hasattr(QWebEngineProfile, "setUrlRequestInterceptor"):
                self.profile.setUrlRequestInterceptor(self.interceptor)
            else:  # Older Qt5 versions
                self.profile.setRequestInterceptor(self.interceptor)

        self.page.setBackgroundColor(QColor(0, 0, 0))
        self.window.setStyleSheet("""QMainWindow, QWebEngineView {
	                                background: #000000;
                                 }""")

        self.window.setCentralWidget(self.view)

        logger.debug("Browser Window created")

    def load(self):
        """Load theme and initialize bridge"""
        self.load_theme()

        self.bridge_objects = (self.greeter, self.greeter_config,
                               self.theme_utils)
        self.initialize_bridge_objects()
        self.load_script(':/_greeter/js/bundle.js', 'Web Greeter Bundle')

    def _initialize_devtools(self):
        self.dev_view = QWebEngineView(parent=self.window)
        self.dev_page = WebPage()
        self.dev_view.setPage(self.dev_page)
        self.page.setDevToolsPage(self.dev_page)
        self.dev_view.setObjectName("Devtools view")
        self.dev_page.setObjectName("Devtools page")

        self.dev_page.windowCloseRequested.connect(
            lambda: self.toggle_devtools_value(False))

        inspect_element_action = self.page.action(self.page.InspectElement)
        inspect_element_action.triggered.connect(
            lambda: self.toggle_devtools_value(True))

        self.qdock = QDockWidget()
        self.qdock.setWidget(self.dev_view)
        self.qdock.setFeatures(QDockWidget.DockWidgetMovable
                               or QDockWidget.DockWidgetClosable)

        self.window.addDockWidget(Qt.RightDockWidgetArea, self.qdock)
        self.qdock.hide()
        logger.debug("DevTools initialized")

    def toggle_devtools(self):
        """Toggle devtools"""
        if not web_greeter_config["config"]["greeter"]["debug_mode"]:
            return
        self.toggle_devtools_value(not self.qdock.isVisible())

    def toggle_devtools_value(self, value: bool):
        """Toggle devtools by value"""
        if not web_greeter_config["config"]["greeter"]["debug_mode"]:
            return

        if value:
            self.qdock.show()
            self.dev_view.setFocus()
        else:
            self.qdock.hide()
            self.view.setFocus()

    def _init_actions(self):
        """Init browser actions"""
        self.exit_action = QAction(QIcon("exit.png"), "&Quit", self.window)
        self.exit_action.setShortcut("Ctrl+Q")
        self.exit_action.setStatusTip("Exit application")
        self.exit_action.triggered.connect(qApp.quit)

        self.toggle_dev_action = QAction("Toggle Developer Tools", self.window)
        self.toggle_dev_action.setShortcut("Ctrl+Shift+I")
        self.toggle_dev_action.triggered.connect(self.toggle_devtools)

        self.fullscreen_action = QAction("Toggle Fullscreen", self.window)
        self.fullscreen_action.setShortcut("F11")
        self.fullscreen_action.triggered.connect(
            lambda: self.toggle_fullscreen(not self.window.isFullScreen()))

        self.inc_zoom_action = QAction("Zoom In", self.window)
        self.inc_zoom_action.setShortcut("Ctrl++")
        self.inc_zoom_action.triggered.connect(self._inc_zoom)
        self.dec_zoom_action = QAction("Zoom Out", self.window)
        self.dec_zoom_action.setShortcut("Ctrl+-")
        self.dec_zoom_action.triggered.connect(self._dec_zoom)
        self.reset_zoom_action = QAction("Actual Size", self.window)
        self.reset_zoom_action.setShortcut("Ctrl+0")
        self.reset_zoom_action.triggered.connect(self._reset_zoom)

        self.window.addAction(self.exit_action)
        self.window.addAction(self.toggle_dev_action)
        self.window.addAction(self.fullscreen_action)
        self.window.addAction(self.inc_zoom_action)
        self.window.addAction(self.dec_zoom_action)
        self.window.addAction(self.reset_zoom_action)

    def _inc_zoom(self):
        if self.view.hasFocus():
            self.page.increaseZoom()
        else:
            self.dev_page.increaseZoom()

    def _dec_zoom(self):
        if self.view.hasFocus():
            self.page.decreaseZoom()
        else:
            self.dev_page.decreaseZoom()

    def _reset_zoom(self):
        if self.view.hasFocus():
            self.page.setZoomFactor(1)
        else:
            self.dev_page.setZoomFactor(1)

    def _init_menu_bar(self):
        minimize_action = QAction("Minimize", self.window)
        minimize_action.setShortcut("Ctrl+M")
        minimize_action.triggered.connect(self.window.showMinimized)
        close_action = QAction("Close", self.window)
        close_action.setShortcut("Ctrl+W")
        close_action.triggered.connect(self.window.close)

        self.page.action(
            self.page.ReloadAndBypassCache).setText("Force Reload")

        self.page.fullScreenRequested.connect(self.accept_fullscreen)

        self.menu_bar = QMenuBar()

        file_menu = self.menu_bar.addMenu("&File")
        file_menu.addAction(self.exit_action)

        edit_menu = self.menu_bar.addMenu("&Edit")
        edit_menu.addAction(self.page.action(self.page.Undo))
        edit_menu.addAction(self.page.action(self.page.Redo))
        edit_menu.addSeparator()
        edit_menu.addAction(self.page.action(self.page.Cut))
        edit_menu.addAction(self.page.action(self.page.Copy))
        edit_menu.addAction(self.page.action(self.page.Paste))
        edit_menu.addSeparator()
        edit_menu.addAction(self.page.action(self.page.SelectAll))

        view_menu = self.menu_bar.addMenu("&View")
        view_menu.addAction(self.page.action(self.page.Reload))
        view_menu.addAction(self.page.action(self.page.ReloadAndBypassCache))
        view_menu.addAction(self.toggle_dev_action)
        view_menu.addSeparator()
        view_menu.addAction(self.reset_zoom_action)
        view_menu.addAction(self.inc_zoom_action)
        view_menu.addAction(self.dec_zoom_action)
        view_menu.addSeparator()
        view_menu.addAction(self.fullscreen_action)

        window_menu = self.menu_bar.addMenu("&Window")
        window_menu.addAction(minimize_action)
        window_menu.addAction(close_action)

        # help_menu = menu_bar.addMenu("&Help")

        self.window.setMenuBar(self.menu_bar)

    def accept_fullscreen(self, request):
        """Accepts fullscreen requests"""
        if web_greeter_config["config"]["greeter"]["debug_mode"]:
            request.reject()
            return
        if request.toggleOn():
            self.toggle_fullscreen(True)
        else:
            self.toggle_fullscreen(False)
        request.accept()

    def toggle_fullscreen(self, value: bool):
        """Toggle fullscreen"""
        if not web_greeter_config["config"]["greeter"]["debug_mode"]:
            return
        if value:
            state = self.states["FULLSCREEN"]
            self.window.setWindowFlags(self.window.windowFlags()
                                       or Qt.FramelessWindowHint)
            self.menu_bar.setParent(None)
            self.window.setMenuBar(None)
        else:
            state = self.states["NORMAL"]
            self.window.setWindowFlags(self.window.windowFlags()
                                       or not Qt.FramelessWindowHint)
            self.window.setMenuBar(self.menu_bar)
        try:
            self.window.windowHandle().setWindowState(state)
        except (AttributeError, TypeError):
            self.window.setWindowState(state)

    def _initialize_page(self):
        page_settings = self.page.settings().globalSettings()

        if not web_greeter_config["config"]["greeter"]["secure_mode"]:
            ENABLED_SETTINGS.append('LocalContentCanAccessRemoteUrls')
        else:
            DISABLED_SETTINGS.append('LocalContentCanAccessRemoteUrls')

        for setting in DISABLED_SETTINGS:
            try:
                page_settings.setAttribute(
                    getattr(QWebEngineSettings, setting), False)
            except AttributeError:
                pass

        for setting in ENABLED_SETTINGS:
            try:
                page_settings.setAttribute(
                    getattr(QWebEngineSettings, setting), True)
            except AttributeError:
                pass

        self.page.setView(self.view)

    def load_theme(self):
        """Load theme"""
        theme = web_greeter_config["config"]["greeter"]["theme"]
        dir_t = "/usr/share/web-greeter/themes/"
        path_to_theme = os.path.join(dir_t, theme, "index.html")
        def_theme = "gruvbox"

        if theme.startswith("/"):
            path_to_theme = theme
        elif theme.__contains__(".") or theme.__contains__("/"):
            path_to_theme = os.path.join(os.getcwd(), theme)
            path_to_theme = os.path.realpath(path_to_theme)

        if not path_to_theme.endswith(".html"):
            path_to_theme = os.path.join(path_to_theme, "index.html")

        if not os.path.exists(path_to_theme):
            print("Path does not exists", path_to_theme)
            path_to_theme = os.path.join(dir_t, def_theme, "index.html")

        web_greeter_config["config"]["greeter"]["theme"] = path_to_theme

        url = QUrl(f"web-greeter://app/{path_to_theme}")
        self.page.load(url)

        logger.debug("Theme loaded")

    @staticmethod
    def _create_webengine_script(path: Url, name: str) -> QWebEngineScript:
        script = QWebEngineScript()
        script_file = QFile(path)

        # print(script_file, path)

        if script_file.open(QFile.ReadOnly):
            script_string = str(script_file.readAll(), 'utf-8')

            script.setInjectionPoint(QWebEngineScript.DocumentCreation)
            script.setName(name)
            script.setWorldId(QWebEngineScript.MainWorld)
            script.setSourceCode(script_string)
            # print(script_string)

        return script

    def _get_channel_api_script(self) -> QWebEngineScript:
        return self._create_webengine_script(':/qtwebchannel/qwebchannel.js',
                                             'QWebChannel API')

    def _init_bridge_channel(self) -> None:
        self.page.setWebChannel(self.channel)
        self.bridge_initialized = True

    def initialize_bridge_objects(self) -> None:
        """Initialize bridge objects :D"""
        if not self.bridge_initialized:
            self._init_bridge_channel()
        registered_objects = self.channel.registeredObjects()

        for obj in self.bridge_objects:
            if obj not in registered_objects:
                # pylint: disable=protected-access
                self.channel.registerObject(obj._name, obj)
                # print("Registered", obj._name)

    def load_script(self, path: Url, name: str):
        """Loads a script in page"""
        qt_api = self._get_channel_api_script()
        qt_api_source = qt_api.sourceCode()
        script = self._create_webengine_script(path, name)
        script.setSourceCode(qt_api_source + "\n" + script.sourceCode())
        self.page.scripts().insert(script)
コード例 #2
0
ファイル: Browser.py プロジェクト: bing-idea/ToolBox
class Browser(Ui):
    def __init__(self):
        super(Browser, self).__init__()
        # self.resize(480,640)
        # self.setWindowTitle("Twinkstar")
        # # self.setWindowFlag(Qt.FramelessWindowHint)
        self.btn_home_browser.clicked.connect(self.browser_ui_reload)

        # 窗口配置初始化
        self.__init_var()
        self.__init_main()
        self.__init_tools()
        # self.__init_zoom()
        self.__init_bookmark()
        self.__init_browser_tab()
        self.__init_browser()
        self.__init_event_connect()
        self.setVisible_by_layout(self.glayout_browser_main, False)

        # # css样式表导入
        # css = open(r'.\resources\main_ui.css','r',encoding='utf-8').read()
        # self.setStyleSheet(css)

        # 屏幕分辨率
        self.screen_size = QApplication.desktop()


    @layout_dele
    def browser_ui_reload(self,*args):

        if func_historys[3]:self.btn_top_forward.setVisible(True)
        else:self.btn_top_forward.setVisible(False)

        self.setVisible_by_layout(self.glayout_browser_main, True)
        self.widget_browser.setVisible(True)

        return self.glayout_browser_main

    def __init_main(self):

        self.glayout_browser_main = QGridLayout()
        self.glayout_browser_main.setObjectName('grade_2')
        self.glayout_browser_main.setContentsMargins(0, 0, 0, 0)
        self.glayout_browser_main.setSpacing(0)
        # self.setMouseTracking(True)
        self.widget_browser = QWidget()
        self.widget_browser.setLayout(self.glayout_browser_main)
        self.widget_browser.setFixedSize(self.width(),self.height()-25)
        self.widget_browser.setVisible(False)
        # css样式表导入
        css = open(r'.\resources\main_ui.css','r',encoding='utf-8').read()
        # self.setStyleSheet(css)
        self.widget_browser.setStyleSheet(css)
        # 设置窗口总布局
        # self.setLayout(self.glayout_browser_main)
        # self.glayout_main.addLayout(self.glayout_browser_main, 2, 0)
        self.glayout_main.addWidget(self.widget_browser,2,0)
        # 为第一行的工具栏和窗口管理设置一个总布局
        self.glayout_first_row = QGridLayout()
        self.glayout_first_row.setObjectName("glayout_first_row")
        self.glayout_browser_main.addLayout(self.glayout_first_row, 0, 0)

        # 浏览器TAB页总布局
        self.glayout_tab_main = QGridLayout()
        self.glayout_tab_main.setObjectName("glayout_tab_main")
        self.glayout_browser_main.addLayout(self.glayout_tab_main, 1, 0)
        self.glayout_tab_main.setContentsMargins(0, 0, 0, 0)

    def __init_zoom(self):
        """
        窗口关闭、最小化、最大化
        :return:
        """
        self.glayout_zoom = QGridLayout()
        self.glayout_first_row.addLayout(self.glayout_zoom, 0,1)
        self.btn_zoom_min = QToolButton()
        self.btn_zoom_min.setObjectName("btn_zoom")
        self.btn_zoom_max = QToolButton()
        self.btn_zoom_max.setObjectName("btn_zoom")
        self.btn_zoom_close = QToolButton()
        self.btn_zoom_close.setObjectName("btn_zoom")
        Tools = [self.btn_zoom_min, self.btn_zoom_max, self.btn_zoom_close]
        ICOS = ['min.png', 'max1.png', 'close.png']
        for index, tool in enumerate(Tools):
            _ico = QIcon("./resources/ico/{}".format(ICOS[index]))
            tool.setIcon(_ico) # 添加图标
            # tool.setFixedSize(30,30)
            self.glayout_zoom.addWidget(tool, 0,index,1,1) # 加入布局
        # 记录鼠标按键状态
        self.mouse_left_state = False
        self.mouse_right_state = False
        self.mouse_mid_state = False
        # 记录鼠标相对窗口的位置
        self.mouse_curser = object

        # 窗口最大化状态
        self.zoom_max_state = False
        # 窗口最大化前的尺寸
        self.old_size = self.size()
        # 窗口最大化之前的位置
        self.old_pos = self.pos()



    def __init_tools(self):
        """
        工具栏&菜单栏
        :return:
        """
        self.glayout_tools = QGridLayout()
        self.glayout_tools.setSpacing(0)
        self.glayout_first_row.addLayout(self.glayout_tools,0,0)

        ICOS = [ "back.png", "pre.png", "space", "reload.png", "home.png", "download.png"]
        self.btn_tools_reload = QToolButton()
        self.btn_tools_reload.setObjectName('btn_tools')
        self.btn_tools_back = QToolButton()
        self.btn_tools_back.setObjectName("btn_tools")
        self.btn_tools_pre = QToolButton()
        self.btn_tools_pre.setObjectName("btn_tools")
        self.btn_tools_home = QToolButton()
        self.btn_tools_home.setObjectName("btn_tools")
        self.btn_tools_download = QToolButton()
        self.btn_tools_download.setObjectName("btn_tools")
        self.lnedit_tools_url = QLineEdit()
        self.lnedit_tools_url.setObjectName("lnedit_tools_url")
        Tools = [self.btn_tools_back, self.btn_tools_pre, self.lnedit_tools_url, self.btn_tools_reload, self.btn_tools_home, self.btn_tools_download]
        for tool, ico in zip(Tools, ICOS):
            _ico = QIcon("./resources/ico/{}".format(ico))
            if tool.objectName() == 'lnedit_tools_url':
                continue
            tool.setIcon(_ico)

        for index, tool in enumerate(Tools):
            self.glayout_tools.addWidget(tool, 0,index,1,1)
            # if tool.objectName() == 'lnedit_tools_url':
            #     tool.setFixedHeight(25)
            #     continue
            # tool.setFixedSize(30,30)


    def __init_bookmark(self):
        """
        书签栏
        :return:
        """
        self.glayout_bookmark = QGridLayout()
        self.glayout_browser_main.addLayout(self.glayout_bookmark, 2, 0)
        self.btn_bookmark_ = QToolButton()
        self.btn_bookmark_.setObjectName("btn_bookmark_")
        _ico = QIcon("./resources/ico/bookmark.png")
        self.btn_bookmark_.setIcon(_ico)

        self.glayout_bookmark.addWidget(self.btn_bookmark_, 0,0,1,1)

    def __init_browser_tab(self):
        # 浏览器标签布局
        self.tab_num = 0
        self.glayout_browser_tab = QGridLayout()
        self.glayout_tab_main.addLayout(self.glayout_browser_tab, 0,2)

        # 首部LABEL
        self.label_btab_first = QLabel()
        self.label_btab_first.setObjectName("label_btab_first")
        self.glayout_tab_main.addWidget(self.label_btab_first,0,0)
        self.label_btab_first.setFixedWidth(60)
        self.label_btab_first.setText(" 可拖动")

        # 前部TAB隐藏显示按钮
        self.btn_btab_showtab_first = QToolButton()
        self.btn_btab_showtab_first.setObjectName("btn_btab")
        self.glayout_tab_main.addWidget(self.btn_btab_showtab_first, 0,1)
        self.btn_btab_showtab_first.setIcon(QIcon("./resources/ico/left_s.png"))
        # self.btn_btab_showtab_first.setFixedSize(30,30)


        # 后部TAB隐藏显示
        self.btn_btab_showtab_last = QToolButton()
        self.btn_btab_showtab_last.setObjectName("btn_btab")
        self.glayout_tab_main.addWidget(self.btn_btab_showtab_last,0,3)
        self.btn_btab_showtab_last.setIcon(QIcon("./resources/ico/right_s.png"))
        # self.btn_btab_showtab_last.setFixedSize(30,30)


        # 新建tab按钮
        self.btn_btab_newtab = QToolButton()
        self.btn_btab_newtab.setObjectName("btn_btab")
        self.glayout_tab_main.addWidget(self.btn_btab_newtab,0,4)
        # self.btn_btab_newtab.clicked.connect(self.btn_btab_newtab_clicked)
        self.btn_btab_newtab.setIcon(QIcon("./resources/ico/add.png"))
        # self.btn_btab_newtab.setFixedSize(30,30)

        # 尾部label
        self.label_btab_last = QLabel()
        self.label_btab_last.setObjectName("label_btab_last")
        self.glayout_tab_main.addWidget(self.label_btab_last, 0,5)
        self.label_btab_last.setText("Twinkstar Browser ")
        self.label_btab_last.setAlignment(Qt.AlignRight)







    def __init_browser(self):
        """
        浏览器界面
        :return:
        """

        self.glayout_browser = QGridLayout()
        self.glayout_browser_main.addLayout(self.glayout_browser, 3, 0)
        self.browser = QWebEngineView()
        self.browser.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
        self.browser.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)
        self.browser.settings().setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
        self.glayout_browser.addWidget(self.browser)
        self.browser.load(QUrl("https://www.csdn.net/"))
        # self.breowser.show()


    def __init_var(self):
        # 按键状态
        self.ctrl_state = False
        self.shift_state = False

        # 浏览器缩放比例
        self.breowser_zoom_factor = 1

    def __init_event_connect(self):
        # self.btn_zoom_min.clicked.connect(self.showMinimized)
        # self.btn_zoom_max.clicked.connect(self.showMaximized)
        # self.btn_zoom_close.clicked.connect(self.closeEvent)
        self.lnedit_tools_url.returnPressed.connect(self.lnedit_tools_url_returnPressed)

        # 浏览器
        self.btn_tools_reload.clicked.connect(self.browser.reload)
        self.btn_tools_pre.clicked.connect(self.browser.forward)
        self.btn_tools_back.clicked.connect(self.browser.back)
        self.btn_tools_home.clicked.connect(self.btn_tools_home_clicked)
        self.browser.urlChanged.connect(self.browser_urlChanged)
        self.browser.showMaximized()


    def browser_urlChanged(self,p):
        self.lnedit_tools_url.setText(p.toString())
        u = self.browser.url()
        t = self.browser.title().title()


    def btn_tools_home_clicked(self):
        self.browser.load(QUrl("http://www.baidu.com"))


    def lnedit_tools_url_returnPressed(self):
        url = self.lnedit_tools_url.text()
        print(url)
        if not url.startswith("http"):
            url = 'https://www.baidu.com/s?word={}&tn=88093251_35_hao_pg'.format(url)
        self.browser.load(QUrl(url))




    def resizeEvent(self, a0: QtGui.QResizeEvent) -> None:
        if self.zoom_max_state:
            _ico = QIcon("./resources/ico/max1.png")
            self.btn_zoom_max.setIcon(_ico)
            self.zoom_max_state = False


    def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
        warn = QMessageBox.warning(self,'提示', '确认退出?', QMessageBox.Ok|QMessageBox.No, QMessageBox.No)
        if warn == 1024: # cancel 65536
            sys.exit()



    def showMaximized(self) -> None:
        if self.zoom_max_state:
            self.move(self.old_pos)
            self.resize(self.old_size)
            _ico = QIcon("./resources/ico/max1.png")
            self.btn_zoom_max.setIcon(_ico)
            self.zoom_max_state = False
        else:
            self.old_size = self.size()
            self.old_pos = self.pos()
            _ico = QIcon("./resources/ico/max2.png")
            self.btn_zoom_max.setIcon(_ico)
            self.showFullScreen()
            self.setGeometry(0,0,self.screen_size.width(), self.screen_size.height())
            self.zoom_max_state = True




    def keyPressEvent(self, a0: QtGui.QKeyEvent) -> None:
        # l:16777234 r:16777236 t:16777235 d:16777237 enter:16777221 return:16777220 ctrl:16777249 shift:16777248

        if a0.key() == 16777249: #16777249
            self.ctrl_state = True

        elif a0.key() == 16777248: #16777248
            self.shift_state = True


    def keyReleaseEvent(self, a0: QtGui.QKeyEvent) -> None:
        if a0.key() == 16777249:
            self.ctrl_state = False
        elif a0.key() == 16777248:
            self.shift_state = False



    def wheelEvent(self, a0: QtGui.QWheelEvent) -> None:
        # 调整浏览器缩放
        if self.ctrl_state and self.browser.hasFocus():
            delta = a0.angleDelta()
            if delta.y() > 0:
                if self.breowser_zoom_factor <= 2:
                    self.breowser_zoom_factor *= 1.2
            else:
                if self.breowser_zoom_factor >= 0.3:
                    self.breowser_zoom_factor *= 0.8
            self.browser.setZoomFactor(self.breowser_zoom_factor)

    def mouseMoveEvent(self, a0: QtGui.QMouseEvent) -> None:

        if self.mouse_left_state:
            # 实现窗口移动
            pos = a0.globalPos() - self.mouse_curser
            self.move(pos)

    def mousePressEvent_(self, a0: QtGui.QMouseEvent) -> None:
        # 将鼠标按键信号与状态变量绑定
        if a0.button() == Qt.LeftButton:
            self.mouse_curser = a0.pos()
            self.mouse_left_state = True
        elif a0.button() == Qt.RightButton:
            self.mouse_right_state = True
        elif a0.button() == Qt.MidButton:
            self.mouse_mid_state = True

    def mouseReleaseEven_t(self, a0: QtGui.QMouseEvent) -> None:
        # 恢复鼠标按键状态
        if a0.button() == Qt.LeftButton:
            self.mouse_left_state = False
        elif a0.button() == Qt.RightButton:
            self.mouse_right_state = False
        elif a0.button() == Qt.MidButton:
            self.mouse_mid_state = False

    def mousePressEvent__(self, event):
        if (event.button() == QtCore.Qt.LeftButton) and (event.pos() in self.corner_rect):
            # 鼠标左键点击右下角边界区域
            self._corner_drag = True
            event.accept()
        elif (event.button() == QtCore.Qt.LeftButton) and (event.pos() in self.right_rect):
            # 鼠标左键点击右侧边界区域
            self._right_drag = True
            event.accept()
        elif (event.button() == QtCore.Qt.LeftButton) and (event.pos() in self.bottom_rect):
            # 鼠标左键点击下侧边界区域
            self._bottom_drag = True
            event.accept()
        elif (event.button() == QtCore.Qt.LeftButton) and (event.pos() in self.left_rect):
            # 鼠标左键点击右侧边界区域
            self._left_drag = True
            event.accept()

        elif (event.button() == QtCore.Qt.LeftButton) and (event.pos() in self.top_rect):
            # 鼠标左键点击下侧边界区域
            self._top_drag = True
            event.accept()
        elif (event.button() == QtCore.Qt.LeftButton) and (event.pos() in self.leftcprner_rect):
            self._leftcorner_drag = True
            event.accept()

        # 移动
        elif (event.button() == QtCore.Qt.LeftButton or event.button() == QtCore.Qt.MidButton) and (event.pos() in self.move_rect):
            # if  self._top_drag == False and self._left_drag == False and self._corner_drag == False and self._bottom_drag == False and self._right_drag == False:
            self.m_flag = True
            self.m_Position = event.globalPos() - self.pos()  # 获取鼠标相对窗口的位置
            event.accept()
            self.setCursor(QCursor(QtCore.Qt.OpenHandCursor))  # 更改鼠标图标





    def mouseMoveEvent__(self, QMouseEvent):
        if QMouseEvent.pos() in self.corner_rect:
            self.setCursor(QtCore.Qt.SizeFDiagCursor)
        elif QMouseEvent.pos() in self.bottom_rect:
            self.setCursor(QtCore.Qt.SizeVerCursor)
        elif QMouseEvent.pos() in self.right_rect:
            self.setCursor(QtCore.Qt.SizeHorCursor)
        elif QMouseEvent.pos() in self.top_rect:
            self.setCursor(QtCore.Qt.SizeVerCursor)
        elif QMouseEvent.pos() in self.left_rect:
            self.setCursor(QtCore.Qt.SizeHorCursor)
        elif QMouseEvent.pos() in self.leftcprner_rect:
            self.setCursor(QtCore.Qt.SizeFDiagCursor)
        elif self.m_flag:
            self.setCursor(QtCore.Qt.OpenHandCursor)


        else:
            self.setCursor(QtCore.Qt.ArrowCursor)

        if QtCore.Qt.LeftButton and self._right_drag:
            # 右侧调整窗口宽度
            self.resize(QMouseEvent.pos().x(), self.height())
            QMouseEvent.accept()
        elif QtCore.Qt.LeftButton and self._bottom_drag:
            # 下侧调整窗口高度
            self.resize(self.width(), QMouseEvent.pos().y())
            QMouseEvent.accept()
        elif QtCore.Qt.LeftButton and self._corner_drag:
            # 右下角同时调整高度和宽度
            self.resize(QMouseEvent.pos().x(), QMouseEvent.pos().y())
            QMouseEvent.accept()
        elif QtCore.Qt.LeftButton and self._top_drag:
            # 上侧侧调整窗口高度
            self.setGeometry(self.pos().x(), QMouseEvent.globalPos().y(), self.width(), (self.pos().y() + self.height() - QMouseEvent.globalPos().y()))
            QMouseEvent.accept()
        elif QtCore.Qt.LeftButton and self._left_drag:
            # 左侧同时调整高度和宽度
            self.setGeometry(QMouseEvent.globalPos().x(), self.pos().y(), (self.pos().x() + self.width() - QMouseEvent.globalPos().x()), self.height())

            QMouseEvent.accept()
        elif QtCore.Qt.LeftButton and self._leftcorner_drag:
            self.setGeometry(QMouseEvent.globalPos().x(), QMouseEvent.globalPos().y(),
                             (self.width() + self.pos().x() - QMouseEvent.globalPos().x()), (self.height() + self.pos().y() - QMouseEvent.globalPos().y()))
            QMouseEvent.accept()

        elif QtCore.Qt.LeftButton and self.m_flag:
            self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置
            QMouseEvent.accept()