class MainWindow(QMainWindow): """ """ def __init__(self): super(MainWindow, self).__init__() self.menu_bar = QMenuBar() self.file_menu = QMenu("文件(&F)", self.menu_bar) self.open_action = QAction("打开(O)", self.file_menu) self.open_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O)) self.search_action = QAction("搜索(F)", self.file_menu) self.search_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_F)) self.search_action.triggered.connect(self.show_search_widget) self.close_action = QAction("关闭(C)", self.file_menu) self.close_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_C)) self.close_action.triggered.connect(self.answer_close_action_triggered) self.quit_action = QAction("退出(Q)", self.file_menu) self.quit_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Q)) self.quit_action.triggered.connect(lambda: sys.exit()) self.play_menu = QMenu("播放(&L)", self.menu_bar) self.play_action = QAction("播放(P)", self.play_menu) self.stop_action = QAction("停止(S)", self.play_menu) self.pause_action = QAction("暂停(P)", self.play_menu) self.resume_action = QAction("恢复(R)", self.play_menu) self.rate_action = QAction("倍速(R)", self.play_menu) self.jump_action = QAction("跳转(J)", self.play_menu) self.mute_action = QAction("静音(M)", self.play_menu) self.volume_up_action = QAction("增大音量(U)", self.play_menu) self.volume_down_action = QAction("减小音量(D)", self.play_menu) self.enhance_menu = QMenu("增强(&E)", self.menu_bar) self.skin_menu = QMenu("换肤", self.enhance_menu) self.dark_skin_action = QAction("暗黑模式", self.skin_menu) self.dark_skin_action.setCheckable(True) self.dark_skin_action.triggered.connect( self.answer_dark_skin_action_triggered) self.white_skin_action = QAction("纯白模式", self.skin_menu) self.white_skin_action.setCheckable(True) self.white_skin_action.triggered.connect( self.answer_white_skin_action_triggered) self.blue_skin_action = QAction("浅蓝模式", self.skin_menu) self.blue_skin_action.setCheckable(True) self.blue_skin_action.triggered.connect( self.answer_blue_skin_action_triggered) self.skin_action_group = QActionGroup(self) self.skin_action_group.addAction(self.dark_skin_action) self.skin_action_group.addAction(self.white_skin_action) self.skin_action_group.addAction(self.blue_skin_action) self.language_menu = QMenu("语言", self.enhance_menu) self.zh_CN_action = QAction("简体中文", self.language_menu) self.zh_CN_action.setCheckable(True) self.zh_CN_action.triggered.connect(self.answer_zh_CN_action_triggered) self.en_action = QAction("English", self.language_menu) self.en_action.setCheckable(True) self.en_action.triggered.connect(self.answer_en_action_triggered) self.language_action_group = QActionGroup(self) self.language_action_group.addAction(self.zh_CN_action) self.language_action_group.addAction(self.en_action) self.font_action = QAction("字体(F)", self.enhance_menu) self.font_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_S)) self.font_action.triggered.connect(self.answer_font_action_triggered) self.hide_action = QAction("隐藏(V)", self.enhance_menu) self.hide_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_V)) self.hide_action.setCheckable(True) self.hide_action.triggered.connect(self.answer_hide_action_triggered) self.tool_menu = QMenu("工具(&T)", self.menu_bar) self.screenshot_action = QAction("截图(J)", self.tool_menu) self.screenshot_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_J)) self.screenshot_action.triggered.connect( self.answer_screenshot_action_triggered) self.gif_action = QAction("动图(G)", self.tool_menu) self.gif_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_G)) self.gif_action.triggered.connect(self.answer_gif_action_triggered) self.screen_record_action = QAction("录屏(L)", self.tool_menu) self.screen_record_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_L)) self.screen_record_action.triggered.connect( self.answer_screen_record_action_triggered) self.help_menu = QMenu("帮助(&H)", self.menu_bar) self.help_action = QAction("帮助文档(H)", self.help_menu) self.help_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_H)) self.help_action.triggered.connect(self.answer_help_action_triggered) self.change_log_action = QAction("更新日志(U)", self.help_menu) self.change_log_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_U)) self.change_log_action.triggered.connect( self.answer_change_log_action_triggered) self.check_version_action = QAction("检查版本(C)", self.help_menu) self.check_version_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_C)) self.check_version_action.triggered.connect( self.answer_check_version_action_triggered) self.about_action = QAction("关于软件(A)", self.help_menu) self.about_action.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_A)) self.about_action.triggered.connect(self.answer_about_action_triggered) self.tool_bar = QToolBar() self.tool_bar.setFloatable(False) self.tool_bar.setMovable(True) self.tool_bar.setIconSize(QSize(32, 32)) # self.tool_bar.setStyleSheet("QToolBar{border: 1px solid #313335; spacing:5px; }") self.addToolBar(Qt.TopToolBarArea, self.tool_bar) self.search_tool_action = QAction("", self.tool_bar) self.search_tool_action.setToolTip("信息搜索") self.search_tool_action.setIcon( QIcon("./resources/img/[email protected]")) self.search_widget = SearchWidget() self.search_tool_action.triggered.connect(self.show_search_widget) self.search_widget.watch_live_signal.connect( self.answer_watch_live_signal) self.attention_tool_action = QAction("", self.tool_bar) self.attention_tool_action.setToolTip("历史关注") self.attention_tool_action.setIcon( QIcon("./resources/img/[email protected]")) # self.attention_tool_action.triggered.connect(self.show_search_widget) self.pure_tool_action = QAction("", self.tool_bar) self.pure_tool_action.setToolTip("纯净模式") self.pure_tool_action.setIcon( QIcon("./resources/img/[email protected]")) # self.pure_tool_action.triggered.connect(self.show_search_widget) self.nlp_tool_action = QAction("", self.tool_bar) self.nlp_tool_action.setToolTip("智能字幕") self.nlp_tool_action.setIcon(QIcon("./resources/img/[email protected]")) # self.nlp_tool_action.triggered.connect(self.show_search_widget) self.note_tool_action = QAction("", self.tool_bar) self.note_tool_action.setToolTip("边看边记") self.note_tool_action.setIcon( QIcon("./resources/img/[email protected]")) # self.note_tool_action.triggered.connect(self.show_search_widget) self.live_widget = LiveWidget() self.init_ui() self._init_cfg() def init_ui(self): """ :return: """ # 菜单栏 self.file_menu.addAction(self.open_action) self.file_menu.addAction(self.search_action) self.file_menu.addSeparator() self.file_menu.addAction(self.close_action) self.file_menu.addAction(self.quit_action) self.play_menu.addAction(self.play_action) self.play_menu.addAction(self.stop_action) self.play_menu.addAction(self.pause_action) self.play_menu.addAction(self.resume_action) self.play_menu.addSeparator() self.play_menu.addAction(self.rate_action) self.play_menu.addAction(self.jump_action) self.play_menu.addSeparator() self.play_menu.addAction(self.mute_action) self.play_menu.addAction(self.volume_up_action) self.play_menu.addAction(self.volume_down_action) self.enhance_menu.addMenu(self.skin_menu) self.skin_menu.addAction(self.dark_skin_action) self.skin_menu.addAction(self.white_skin_action) self.skin_menu.addAction(self.blue_skin_action) self.enhance_menu.addMenu(self.language_menu) self.language_menu.addAction(self.zh_CN_action) self.language_menu.addAction(self.en_action) self.enhance_menu.addAction(self.font_action) self.enhance_menu.addSeparator() self.enhance_menu.addAction(self.hide_action) self.tool_menu.addAction(self.screenshot_action) self.tool_menu.addAction(self.gif_action) self.tool_menu.addAction(self.screen_record_action) self.tool_menu.addSeparator() self.help_menu.addAction(self.help_action) self.help_menu.addAction(self.change_log_action) self.help_menu.addAction(self.check_version_action) self.help_menu.addSeparator() self.help_menu.addAction(self.about_action) self.menu_bar.addMenu(self.file_menu) self.menu_bar.addMenu(self.play_menu) self.menu_bar.addMenu(self.enhance_menu) self.menu_bar.addMenu(self.tool_menu) self.menu_bar.addMenu(self.help_menu) self.setMenuBar(self.menu_bar) # 工具栏 self.tool_bar.addAction(self.search_tool_action) self.tool_bar.addSeparator() self.tool_bar.addAction(self.attention_tool_action) self.tool_bar.addSeparator() self.tool_bar.addAction(self.pure_tool_action) self.tool_bar.addSeparator() self.tool_bar.addAction(self.nlp_tool_action) self.tool_bar.addSeparator() self.tool_bar.addAction(self.note_tool_action) self.tool_bar.addSeparator() # 显示区域 self.setCentralWidget(self.live_widget) self.set_window_info() def _init_cfg(self): """ :return: """ # 工具栏可见性 visible = retrieve_content("preferences", "tool_bar_visible") if visible == "True": self.hide_action.setChecked(False) self.hide_action.triggered.emit(False) else: self.hide_action.setChecked(True) self.hide_action.triggered.emit(True) # 工具栏位置 position = retrieve_content("preferences", "tool_bar_position") # 皮肤设置 skin = retrieve_content("preferences", "skin") if skin == "dark": self.dark_skin_action.setChecked(True) self.dark_skin_action.triggered.emit() elif skin == "white": self.white_skin_action.setChecked(True) self.white_skin_action.triggered.emit() else: self.blue_skin_action.setChecked(True) self.blue_skin_action.triggered.emit() # 字体设置 font_family = retrieve_content("preferences", "font-family") font_style = retrieve_content("preferences", "font-style") font_size = retrieve_content("preferences", "font-size") font = QFont() font.setFamily(font_family) font.setStyleName(font_style) font.setPointSize(int(font_size)) qApp.setFont(font) qApp.processEvents() def set_window_info(self): """ :return: """ desktop_widget = QDesktopWidget() screen_rect = desktop_widget.screenGeometry() self.setGeometry(screen_rect) title = retrieve_content("software_info", "software_name") + " " + retrieve_content( "software_info", "software_version") self.setWindowTitle(title) self.setWindowIcon(QIcon('./resources/img/[email protected]')) self.showMaximized() def show_search_widget(self): """ :return: """ width, height = get_window_center_point(self.search_widget) self.search_widget.move(width, height) self.search_widget.exec_() @staticmethod def answer_help_action_triggered(): """ :return: """ desktop_services = QDesktopServices() desktop_services.openUrl( QUrl( "https://github.com/parzulpan/real-live/blob/master/resources/Help.md" )) @staticmethod def answer_change_log_action_triggered(): """ :return: """ desktop_services = QDesktopServices() desktop_services.openUrl( QUrl( "https://github.com/parzulpan/real-live/blob/master/resources/ChangeLog.md" )) @staticmethod def answer_check_version_action_triggered(): """ :return: """ # TODO: 获取GitHub API 进行检查并弹窗 desktop_services = QDesktopServices() desktop_services.openUrl( QUrl("https://github.com/parzulpan/real-live/releases")) @staticmethod def answer_about_action_triggered(): """ :return: """ about_widget = AboutWidget() width, height = get_window_center_point(about_widget) about_widget.move(width, height) about_widget.exec_() def answer_watch_live_signal(self, url): """ :param url: :return: """ # self.live_widget.vlc_widget.get_player() self.live_widget.vlc_widget.play_url(url) self.live_widget.set_player_widget(True) def answer_close_action_triggered(self): """ :return: """ self.live_widget.set_player_widget(False) # self.live_widget.vlc_widget.get_player() # self.live_widget.vlc_widget.release_player() self.live_widget.vlc_widget.stop() def answer_hide_action_triggered(self, checked): """ :param checked: :return: """ if checked: self.tool_bar.hide() update_contents("preferences", "tool_bar_visible", "False") else: self.tool_bar.show() update_contents("preferences", "tool_bar_visible", "True") def answer_tool_bar_top_level_changed(self, area): """ :return: """ print("top_level_changed") print(area) if self.tool_bar.allowedAreas() == Qt.LeftToolBarArea: print("LeftToolBarArea") elif self.tool_bar.allowedAreas() == Qt.RightToolBarArea: print("RightToolBarArea") elif self.tool_bar.allowedAreas() == Qt.BottomToolBarArea: print("BottomToolBarArea") elif self.tool_bar.allowedAreas() == Qt.TopToolBarArea: print("TopToolBarArea") else: print("else") @staticmethod def answer_screenshot_action_triggered(): """ :return: """ # dll = windll.LoadLibrary('./bin/OEScreenshot.dll') # dll = WinDLL('./bin/OEScreenshot.dll') # dll = cdll.LoadLibrary('./bin/OEScreenshot.dll') dll = CDLL('./bin/screenshot/OEScreenshot.dll') print(dll) def answer_gif_action_triggered(self): """ :return: """ pass def answer_screen_record_action_triggered(self): """ :return: """ pass @staticmethod def answer_dark_skin_action_triggered(checked): """ :param checked: :return: """ with open("./resources/qss/dark.qss", "r", encoding="utf-8") as f: qss = f.read() qApp.setStyleSheet(qss) update_contents("preferences", "skin", "dark") @staticmethod def answer_white_skin_action_triggered(checked): """ :param checked: :return: """ with open("./resources/qss/white.qss", "r", encoding="utf-8") as f: qss = f.read() qApp.setStyleSheet(qss) update_contents("preferences", "skin", "white") @staticmethod def answer_blue_skin_action_triggered(checked): """ :param checked: :return: """ with open("./resources/qss/blue.qss", "r", encoding="utf-8") as f: qss = f.read() qApp.setStyleSheet(qss) update_contents("preferences", "skin", "blue") def answer_font_action_triggered(self, checked): """ :param checked: :return: """ font = qApp.font() font, changed = QFontDialog().getFont(font, self, caption="字体设置") if changed: qApp.setFont(font) qApp.processEvents() update_contents("preferences", "font-family", font.family()) update_contents("preferences", "font-style", font.styleName()) update_contents("preferences", "font-size", str(font.pointSize())) def answer_zh_CN_action_triggered(self, checked): """ :param checked: :return: """ pass def answer_en_action_triggered(self, checked): """ :param checked: :return: """ pass def closeEvent(self, event) -> None: """ :param event: :return: """ print("closeEvent") self.live_widget.vlc_widget.release_player()