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)
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()