Win/Mac/Linux/Andriod/IOS界面UI设计 - pyside6 - 03 文件(JSON/TXT/PD)查看和打印

news2024/11/15 16:47:45

文章目录

  • 写在前面
  • 一、文件(JSON/TXT/PD)查看和打印
    • 1.1 页面效果
    • 1.2 项目目录结构
    • 1.3项目源码
      • 1.3.1 main-app.py
      • 1.3.2 _03_documentviewer\main.py
      • 1.3.3 _03_documentviewer\mainwindow.py
      • 1.3.4 _03_documentviewer\abstractviewer.py
      • 1.3.5 _03_documentviewer\ui_mainwindow.py

写在前面

在这里插入图片描述

这是一个展示PySide6小例子的系列专题,建议创建单独的虚拟环境演示复现。截止本例,所需依赖如下:

PySide6==6.7.2
PySide6_Addons==6.7.2
PySide6_Essentials==6.7.2
setuptools==72.1.0
shiboken6==6.7.2
wheel==0.43.0

建议复制到 requirements.txt 中,然后按下列步骤进行:

  • 下载并安装MiniConda
  • 创建虚拟环境
  • 激活虚拟环境
  • 安装依赖
conda create -n Pyside6-demos python=3.12 -y
conda activate pyside6-demos
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

当然您也可以使用您熟悉的工具和步骤,来实现同样的效果,我只是按个人习惯给您一点建议。
本系列的第一篇文章有比较详细的分解步骤,详见:https://blog.csdn.net/yuetaope/article/details/141051884。
注意:本主题具有连续性,如果您发现本文中的代码因缺少资源跑不起来,请到前面的博文中复制相应的文件。

一、文件(JSON/TXT/PD)查看和打印

1.1 页面效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2 项目目录结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3项目源码

1.3.1 main-app.py

import sys
import importlib

from PySide6.QtWidgets import (QMainWindow, QApplication, QGridLayout,
                               QPushButton, QTabWidget, QVBoxLayout, QWidget)

from utils import apple_like_stylesheet


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 获取屏幕尺寸
        self.screen_width = self.screen().size().width()
        self.screen_height = self.screen().size().height()
        self.W = 800
        self.H = 600
        self.X = (self.screen_width - self.W) / 2  # 左右居中
        self.Y = 50
        # 设置窗口标题和大小
        self.setWindowTitle('西音东岳工作室 pyside6 Demos')
        self.setGeometry(self.X, self.Y, self.W, self.H)
        # 加载样式表
        self.setStyleSheet(apple_like_stylesheet())
        # 设置中心部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        # 布局
        self.main_layout = QVBoxLayout(central_widget)
        # 添加组件
        self.add_widgets_to_main_layout()

    def add_widgets_to_main_layout(self):
        """ 添加组件到主布局 """
        page_tab = self.create_itemview_tabwidget()
        self.main_layout.addWidget(page_tab)

    def create_itemview_tabwidget(self):
        """ 创建Tab标签 """
        result = QTabWidget()
        # 字典值列表的三个字符串遵循:包(__init__.py) -> py文件 -> app类
        self.tab1_btn_dict = {
            '常用小部件库': ['_02_widget_gallery', 'widget_gallery', 'WidgetGallery'],
            '文件(JSON/TXT/PD)查看和打印': ['_03_documentviewer', 'mainwindow', 'MainWindow'],
        }

        # 调用函数,创建tab页
        tab1 = self.create_tab_items()
        # 添加tab页
        result.addTab(tab1, " Qt通用 ")

        return result

    def create_tab_items(self):
        """ 创建tab部件 """
        tab1_btn_dict = self.tab1_btn_dict
        tab_w = QWidget()
        # 创建网格布局
        pdf_btn_layout = QGridLayout()
        # 设置tab部件为网格布局
        tab_w.setLayout(pdf_btn_layout)
        for i, item in enumerate(tab1_btn_dict):
            # 创建按钮,并设置文字
            button = QPushButton(item)
            # 连接到点击槽函数
            button.clicked.connect(self.btn_clicked)
            # 每行4个按钮
            pdf_btn_layout.addWidget(button, i//4, i % 4)

        return tab_w

    def btn_clicked(self):
        tab1_btn_dict = self.tab1_btn_dict
        # 获取点击的父组件
        sender = self.sender()
        # 从按钮字典中,根据点击按钮的文字获取 模块、包和类
        package, module, app_class = tab1_btn_dict[sender.text()]
        # 调用函数,执行相应的模块
        self.import_and_run_sub_app(package, module, app_class)

    def import_and_run_sub_app(self, package, module, app_class):
        """ 动态导入模块,实例化app类,达到动态调用的目的 三个参数:包(__init__.py) -> py文件 -> app类 """
        # 动态导入模块
        module = importlib.import_module(f"{package}.{module}")
        # 将导入的模块中的类实例化,并赋值给self.m变量
        self.m = getattr(module, app_class)()
        # 显示子窗口
        self.m.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

1.3.2 _03_documentviewer\main.py

# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

"""PySide6 port of the Qt Document Viewer demo from Qt v6.x"""

import sys
from argparse import ArgumentParser, RawTextHelpFormatter

from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QCoreApplication

from mainwindow import MainWindow


DESCRIPTION = "A viewer for JSON, PDF and text files"


if __name__ == "__main__":

    app = QApplication([])
    QCoreApplication.setOrganizationName("QtExamples")
    QCoreApplication.setApplicationName("DocumentViewer")
    QCoreApplication.setApplicationVersion("1.0")

    arg_parser = ArgumentParser(description=DESCRIPTION,
                                formatter_class=RawTextHelpFormatter)
    arg_parser.add_argument("file", type=str, nargs="?",
                            help="JSON, PDF or text file to open")
    args = arg_parser.parse_args()
    fileName = args.file

    w = MainWindow()
    w.show()
    if args.file and not w.openFile(args.file):
        sys.exit(-1)

    sys.exit(app.exec())

1.3.3 _03_documentviewer\mainwindow.py

# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

from PySide6.QtWidgets import (QDialog, QFileDialog, QMainWindow, QMessageBox)
from PySide6.QtCore import (QDir, QFile, QFileInfo, QSettings, Slot)

from _03_documentviewer.ui_mainwindow import Ui_MainWindow
from _03_documentviewer.viewerfactory import ViewerFactory
from _03_documentviewer.recentfiles import RecentFiles
from _03_documentviewer.recentfilemenu import RecentFileMenu


settingsDir = "WorkingDir"
settingsMainWindow = "MainWindow"
settingsViewers = "Viewers"
settingsFiles = "RecentFiles"


ABOUT_TEXT = """A Widgets application to display and print JSON,
text and PDF files. Demonstrates various features to use
in widget applications: Using QSettings, query and save
user preferences, manage file histories and control cursor
behavior when hovering over widgets.

"""


class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()

        self._currentDir = QDir()
        self._viewer = None
        self._recentFiles = RecentFiles()

        self.ui.setupUi(self)
        self.ui.actionOpen.triggered.connect(self.onActionOpenTriggered)
        self.ui.actionAbout.triggered.connect(self.onActionAboutTriggered)
        self.ui.actionAboutQt.triggered.connect(self.onActionAboutQtTriggered)

        self._recentFiles = RecentFiles(self.ui.actionRecent)
        self._recentFiles.countChanged.connect(self._recentFilesCountChanged)

        self.readSettings()
        self._factory = ViewerFactory(self.ui.viewArea, self)
        viewers = ", ".join(self._factory.viewerNames())
        self.statusBar().showMessage(f'Available viewers: {viewers}')

        menu = RecentFileMenu(self, self._recentFiles)
        self.ui.actionRecent.setMenu(menu)
        menu.fileOpened.connect(self.openFile)
        button = self.ui.mainToolBar.widgetForAction(self.ui.actionRecent)
        if button:
            self.ui.actionRecent.triggered.connect(button.showMenu)

    @Slot(int)
    def _recentFilesCountChanged(self, count):
        self.ui.actionRecent.setText(f"{count} recent files")

    def closeEvent(self, event):
        self.saveSettings()

    @Slot(int)
    def onActionOpenTriggered(self):
        fileDialog = QFileDialog(self, "Open Document",
                                 self._currentDir.absolutePath())
        while (fileDialog.exec() == QDialog.Accepted
               and not self.openFile(fileDialog.selectedFiles()[0])):
            pass

    @Slot(str)
    def openFile(self, fileName):
        file = QFile(fileName)
        if not file.exists():
            nf = QDir.toNativeSeparators(fileName)
            self.statusBar().showMessage(f"File {nf} could not be opened")
            return False

        fileInfo = QFileInfo(file)
        self._currentDir = fileInfo.dir()
        self._recentFiles.addFile(fileInfo.absoluteFilePath())

        # If a viewer is already open, clean it up and save its settings
        self.resetViewer()
        self._viewer = self._factory.viewer(file)
        if not self._viewer:
            nf = QDir.toNativeSeparators(fileName)
            self.statusBar().showMessage(f"File {nf} can't be opened.")
            return False

        self.ui.actionPrint.setEnabled(self._viewer.hasContent())
        self._viewer.printingEnabledChanged.connect(
            self.ui.actionPrint.setEnabled)
        self.ui.actionPrint.triggered.connect(self._viewer.print_)
        self._viewer.showMessage.connect(self.statusBar().showMessage)

        self._viewer.initViewer(self.ui.actionBack, self.ui.actionForward,
                                self.ui.menuHelp.menuAction(),
                                self.ui.tabWidget)
        self.restoreViewerSettings()
        self.ui.scrollArea.setWidget(self._viewer.widget())
        return True

    @Slot()
    def onActionAboutTriggered(self):
        viewerNames = ", ".join(self._factory.viewerNames())
        mimeTypes = '\n'.join(self._factory.supportedMimeTypes())
        text = ABOUT_TEXT
        text += f"\nThis version has loaded the following plugins:\n{
            viewerNames}\n"
        text += f"\n\nIt supports the following mime types:\n{mimeTypes}"

        defaultViewer = self._factory.defaultViewer()
        if defaultViewer:
            n = defaultViewer.viewerName()
            text += f"\n\nOther mime types will be displayed with {n}."

        QMessageBox.about(self, "About Document Viewer Demo", text)

    @Slot()
    def onActionAboutQtTriggered(self):
        QMessageBox.aboutQt(self)

    def readSettings(self):
        settings = QSettings()

        # Restore working directory
        if settings.contains(settingsDir):
            self._currentDir = QDir(settings.value(settingsDir))
        else:
            self._currentDir = QDir.current()

        # Restore QMainWindow state
        if settings.contains(settingsMainWindow):
            mainWindowState = settings.value(settingsMainWindow)
            self.restoreState(mainWindowState)

        # Restore recent files
        self._recentFiles.restoreFromSettings(settings, settingsFiles)

    def saveSettings(self):
        settings = QSettings()

        # Save working directory
        settings.setValue(settingsDir, self._currentDir.absolutePath())

        # Save QMainWindow state
        settings.setValue(settingsMainWindow, self.saveState())

        # Save recent files
        self._recentFiles.saveSettings(settings, settingsFiles)

        settings.sync()

    def saveViewerSettings(self):
        if not self._viewer:
            return
        settings = QSettings()
        settings.beginGroup(settingsViewers)
        settings.setValue(self._viewer.viewerName(), self._viewer.saveState())
        settings.endGroup()
        settings.sync()

    def resetViewer(self):
        if not self._viewer:
            return
        self.saveViewerSettings()
        self._viewer.cleanup()

    def restoreViewerSettings(self):
        if not self._viewer:
            return
        settings = QSettings()
        settings.beginGroup(settingsViewers)
        viewerSettings = settings.value(self._viewer.viewerName())
        settings.endGroup()
        if viewerSettings:
            self._viewer.restoreState(viewerSettings)

1.3.4 _03_documentviewer\abstractviewer.py

# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

from PySide6.QtCore import QObject

from PySide6.QtWidgets import (QDialog, QMenu)
from PySide6.QtCore import Signal, Slot
from PySide6.QtPrintSupport import QPrinter, QPrintDialog


MENU_NAME = "qtFileMenu"


class AbstractViewer(QObject):

    uiInitialized = Signal()
    printingEnabledChanged = Signal(bool)
    showMessage = Signal(str, int)
    documentLoaded = Signal(str)

    def __init__(self):
        super().__init__()
        self._file = None
        self._widget = None
        self._menus = []
        self._toolBars = []
        self._printingEnabled = False
        self._actions = []
        self._fileMenu = None

    def __del__(self):
        self.cleanup()

    def viewerName(self):
        return ""

    def saveState(self):
        return False

    def restoreState(self, state):
        return False

    def supportedMimeTypes():
        return []

    def init(self, file, widget, mainWindow):
        self._file = file
        self._widget = widget
        self._uiAssets_mainWindow = mainWindow

    def isEmpty(self):
        return not self.hasContent()

    def isPrintingEnabled(self):
        return self._printingEnabled

    def hasContent(self):
        return False

    def supportsOverview(self):
        return False

    def isModified(self):
        return False

    def saveDocument(self):
        return False

    def saveDocumentAs(self):
        return False

    def actions(self):
        return self._actions

    def widget(self):
        return self._widget

    def menus(self):
        return self._menus

    def mainWindow(self):
        return self._uiAssets_mainWindow

    def statusBar(self):
        return self.mainWindow().statusBar()

    def menuBar(self):
        return self.mainWindow().menuBar()

    def maybeEnablePrinting(self):
        self.maybeSetPrintingEnabled(True)

    def disablePrinting(self):
        self.maybeSetPrintingEnabled(False)

    def isDefaultViewer(self):
        return False

    def viewer(self):
        return self

    def statusMessage(self, message, type="", timeout=8000):
        msg = self.viewerName()
        if type:
            msg += "/" + type
        msg += ": " + message
        self.showMessage.emit(msg, timeout)

    def addToolBar(self, title):
        bar = self.mainWindow().addToolBar(title)
        name = title.replace(' ', '')
        bar.setObjectName(name)
        self._toolBars.append(bar)
        return bar

    def addMenu(self, title):
        menu = QMenu(title, self.menuBar())
        menu.setObjectName(title)
        self.menuBar().insertMenu(self._uiAssets_help, menu)
        self._menus.append(menu)
        return menu

    def cleanup(self):
        # delete all objects created by the viewer which need to be displayed
        # and therefore parented on MainWindow
        if self._file:
            self._file = None
        self._menus.clear()
        self._toolBars.clear()

    def fileMenu(self):
        if self._fileMenu:
            return self._fileMenu

        menus = self.mainWindow().findChildren(QMenu)
        for menu in menus:
            if menu.objectName() == MENU_NAME:
                self._fileMenu = menu
                return self._fileMenu
        self._fileMenu = self.addMenu("File")
        self._fileMenu.setObjectName(MENU_NAME)
        return self._fileMenu

    @Slot()
    def print_(self):
        type = "Printing"
        if not self.hasContent():
            self.statusMessage("No content to print.", type)
            return
        printer = QPrinter(QPrinter.HighResolution)
        dlg = QPrintDialog(printer, self.mainWindow())
        dlg.setWindowTitle("Print Document")
        if dlg.exec() == QDialog.Accepted:
            self.printDocument(printer)
        else:
            self.statusMessage("Printing canceled!", type)
            return
        state = printer.printerState()
        message = self.viewerName() + " :"
        if state == QPrinter.PrinterState.Aborted:
            message += "Printing aborted."
        elif state == QPrinter.PrinterState.Active:
            message += "Printing active."
        elif state == QPrinter.PrinterState.Idle:
            message += "Printing completed."
        elif state == QPrinter.PrinterState.Error:
            message += "Printing error."
        self.statusMessage(message, type)

    def maybeSetPrintingEnabled(self, enabled):
        if enabled == self._printingEnabled:
            return
        self._printingEnabled = enabled
        self.printingEnabledChanged.emit(enabled)

    def initViewer(self, back, forward, help, tabs):
        self._uiAssets_back = back
        self._uiAssets_forward = forward
        self._uiAssets_help = help
        self._uiAssets_tabs = tabs
        # Tabs can be populated individually by the viewer, if it
        # supports overview
        tabs.clear()
        tabs.setVisible(self.supportsOverview())
        self.uiInitialized.emit()

1.3.5 _03_documentviewer\ui_mainwindow.py

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

################################################################################
# Form generated from reading UI file 'mainwindow.ui'
##
# Created by: Qt User Interface Compiler version 6.5.3
##
# WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
                            QMetaObject, QObject, QPoint, QRect,
                            QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
                           QCursor, QFont, QFontDatabase, QGradient,
                           QIcon, QImage, QKeySequence, QLinearGradient,
                           QPainter, QPalette, QPixmap, QRadialGradient,
                           QTransform)
from PySide6.QtWidgets import (QApplication, QMainWindow, QMenu, QMenuBar,
                               QScrollArea, QSizePolicy, QSplitter, QStatusBar,
                               QTabWidget, QToolBar, QVBoxLayout, QWidget)
import _03_documentviewer.rc_documentviewer


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(983, 602)
        icon = QIcon()
        icon.addFile(u":/demos/documentviewer/images/qt-logo.png",
                     QSize(), QIcon.Normal, QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.actionOpen = QAction(MainWindow)
        self.actionOpen.setObjectName(u"actionOpen")
        icon1 = QIcon()
        icon1.addFile(u":/demos/documentviewer/images/open.png",
                      QSize(), QIcon.Normal, QIcon.Off)
        self.actionOpen.setIcon(icon1)
        self.actionAbout = QAction(MainWindow)
        self.actionAbout.setObjectName(u"actionAbout")
        icon2 = QIcon()
        iconThemeName = u"help-about"
        if QIcon.hasThemeIcon(iconThemeName):
            icon2 = QIcon.fromTheme(iconThemeName)
        else:
            icon2.addFile(u":/demos/documentviewer/images/help-about.svgz",
                          QSize(), QIcon.Normal, QIcon.Off)

        self.actionAbout.setIcon(icon2)
        self.actionForward = QAction(MainWindow)
        self.actionForward.setObjectName(u"actionForward")
        icon3 = QIcon()
        icon3.addFile(u":/demos/documentviewer/images/go-next.svgz",
                      QSize(), QIcon.Normal, QIcon.Off)
        self.actionForward.setIcon(icon3)
        self.actionBack = QAction(MainWindow)
        self.actionBack.setObjectName(u"actionBack")
        icon4 = QIcon()
        icon4.addFile(u":/demos/documentviewer/images/go-previous.svgz",
                      QSize(), QIcon.Normal, QIcon.Off)
        self.actionBack.setIcon(icon4)
        self.actionPrint = QAction(MainWindow)
        self.actionPrint.setObjectName(u"actionPrint")
        self.actionPrint.setEnabled(False)
        icon5 = QIcon()
        iconThemeName = u"document-print"
        if QIcon.hasThemeIcon(iconThemeName):
            icon5 = QIcon.fromTheme(iconThemeName)
        else:
            icon5.addFile(u":/demos/documentviewer/images/print2x.png",
                          QSize(), QIcon.Normal, QIcon.Off)

        self.actionPrint.setIcon(icon5)
        self.actionAboutQt = QAction(MainWindow)
        self.actionAboutQt.setObjectName(u"actionAboutQt")
        icon6 = QIcon()
        icon6.addFile(u":/demos/documentviewer/images/qt-logo.png",
                      QSize(), QIcon.Normal, QIcon.Off)
        icon6.addFile(u":/demos/documentviewer/images/qt-logo.png",
                      QSize(), QIcon.Normal, QIcon.On)
        self.actionAboutQt.setIcon(icon6)
        self.actionRecent = QAction(MainWindow)
        self.actionRecent.setObjectName(u"actionRecent")
        icon7 = QIcon()
        icon7.addFile(u":/demos/documentviewer/images/document-open-recent.svgz",
                      QSize(), QIcon.Normal, QIcon.Off)
        self.actionRecent.setIcon(icon7)
        self.actionQuit = QAction(MainWindow)
        self.actionQuit.setObjectName(u"actionQuit")
        icon8 = QIcon()
        iconThemeName = u"application-exit"
        if QIcon.hasThemeIcon(iconThemeName):
            icon8 = QIcon.fromTheme(iconThemeName)
        else:
            icon8.addFile(u".", QSize(), QIcon.Normal, QIcon.Off)

        self.actionQuit.setIcon(icon8)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.centralwidget.setEnabled(True)
        self.verticalLayout = QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.viewArea = QWidget(self.centralwidget)
        self.viewArea.setObjectName(u"viewArea")
        self.verticalLayout_2 = QVBoxLayout(self.viewArea)
        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
        self.splitter = QSplitter(self.viewArea)
        self.splitter.setObjectName(u"splitter")
        self.splitter.setOrientation(Qt.Horizontal)
        self.tabWidget = QTabWidget(self.splitter)
        self.tabWidget.setObjectName(u"tabWidget")
        self.tabWidget.setTabPosition(QTabWidget.West)
        self.bookmarkTab = QWidget()
        self.bookmarkTab.setObjectName(u"bookmarkTab")
        self.tabWidget.addTab(self.bookmarkTab, "")
        self.pagesTab = QWidget()
        self.pagesTab.setObjectName(u"pagesTab")
        self.tabWidget.addTab(self.pagesTab, "")
        self.splitter.addWidget(self.tabWidget)
        self.scrollArea = QScrollArea(self.splitter)
        self.scrollArea.setObjectName(u"scrollArea")
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.scrollArea.sizePolicy().hasHeightForWidth())
        self.scrollArea.setSizePolicy(sizePolicy)
        self.scrollArea.setMinimumSize(QSize(800, 0))
        self.scrollArea.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QWidget()
        self.scrollAreaWidgetContents.setObjectName(
            u"scrollAreaWidgetContents")
        self.scrollAreaWidgetContents.setGeometry(QRect(0, 0, 798, 479))
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.splitter.addWidget(self.scrollArea)

        self.verticalLayout_2.addWidget(self.splitter)

        self.verticalLayout.addWidget(self.viewArea)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 983, 23))
        self.qtFileMenu = QMenu(self.menubar)
        self.qtFileMenu.setObjectName(u"qtFileMenu")
        self.menuHelp = QMenu(self.menubar)
        self.menuHelp.setObjectName(u"menuHelp")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.mainToolBar = QToolBar(MainWindow)
        self.mainToolBar.setObjectName(u"mainToolBar")
        MainWindow.addToolBar(Qt.TopToolBarArea, self.mainToolBar)

        self.menubar.addAction(self.qtFileMenu.menuAction())
        self.menubar.addAction(self.menuHelp.menuAction())
        self.qtFileMenu.addAction(self.actionOpen)
        self.qtFileMenu.addAction(self.actionRecent)
        self.qtFileMenu.addAction(self.actionPrint)
        self.qtFileMenu.addAction(self.actionQuit)
        self.menuHelp.addAction(self.actionAbout)
        self.menuHelp.addAction(self.actionAboutQt)
        self.mainToolBar.addAction(self.actionOpen)
        self.mainToolBar.addAction(self.actionRecent)
        self.mainToolBar.addAction(self.actionPrint)
        self.mainToolBar.addSeparator()
        self.mainToolBar.addAction(self.actionBack)
        self.mainToolBar.addAction(self.actionForward)
        self.mainToolBar.addSeparator()

        self.retranslateUi(MainWindow)
        self.actionQuit.triggered.connect(MainWindow.close)

        self.tabWidget.setCurrentIndex(0)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate(
            "MainWindow", u"文件浏览器", None))
        self.actionOpen.setText(
            QCoreApplication.translate("MainWindow", u"打开", None))
# if QT_CONFIG(shortcut)
        self.actionOpen.setShortcut(
            QCoreApplication.translate("MainWindow", u"Ctrl+O", None))
# endif // QT_CONFIG(shortcut)
        self.actionAbout.setText(QCoreApplication.translate(
            "MainWindow", u"关于文档浏览器", None))
# if QT_CONFIG(tooltip)
        self.actionAbout.setToolTip(QCoreApplication.translate(
            "MainWindow", u"显示关于文档浏览器的信息.", None))
# endif // QT_CONFIG(tooltip)
# if QT_CONFIG(shortcut)
        self.actionAbout.setShortcut(
            QCoreApplication.translate("MainWindow", u"Ctrl+H", None))
# endif // QT_CONFIG(shortcut)
        self.actionForward.setText(QCoreApplication.translate(
            "MainWindow", u"向前", None))
# if QT_CONFIG(tooltip)
        self.actionForward.setToolTip(QCoreApplication.translate(
            "MainWindow", u"向前一步", None))
# endif // QT_CONFIG(tooltip)
# if QT_CONFIG(shortcut)
        self.actionForward.setShortcut(
            QCoreApplication.translate("MainWindow", u"Right", None))
# endif // QT_CONFIG(shortcut)
        self.actionBack.setText(QCoreApplication.translate(
            "MainWindow", u"回退", None))
# if QT_CONFIG(tooltip)
        self.actionBack.setToolTip(QCoreApplication.translate(
            "MainWindow", u"回退一步", None))
# endif // QT_CONFIG(tooltip)
# if QT_CONFIG(shortcut)
        self.actionBack.setShortcut(
            QCoreApplication.translate("MainWindow", u"Left", None))
# endif // QT_CONFIG(shortcut)
        self.actionPrint.setText(
            QCoreApplication.translate("MainWindow", u"打印", None))
# if QT_CONFIG(tooltip)
        self.actionPrint.setToolTip(QCoreApplication.translate(
            "MainWindow", u"打印当前文件", None))
# endif // QT_CONFIG(tooltip)
# if QT_CONFIG(shortcut)
        self.actionPrint.setShortcut(
            QCoreApplication.translate("MainWindow", u"Ctrl+P", None))
# endif // QT_CONFIG(shortcut)
        self.actionAboutQt.setText(
            QCoreApplication.translate("MainWindow", u"关于 Qt", None))
# if QT_CONFIG(tooltip)
        self.actionAboutQt.setToolTip(QCoreApplication.translate(
            "MainWindow", u"显示QT许可信息", None))
# endif // QT_CONFIG(tooltip)
# if QT_CONFIG(shortcut)
        self.actionAboutQt.setShortcut(
            QCoreApplication.translate("MainWindow", u"Ctrl+I", None))
# endif // QT_CONFIG(shortcut)
        self.actionRecent.setText(QCoreApplication.translate(
            "MainWindow", u"最近打开...", None))
# if QT_CONFIG(shortcut)
        self.actionRecent.setShortcut(
            QCoreApplication.translate("MainWindow", u"Meta+R", None))
# endif // QT_CONFIG(shortcut)
        self.actionQuit.setText(
            QCoreApplication.translate("MainWindow", u"退出", None))
# if QT_CONFIG(tooltip)
        self.actionQuit.setToolTip(QCoreApplication.translate(
            "MainWindow", u"Quit the application", None))
# endif // QT_CONFIG(tooltip)
# if QT_CONFIG(shortcut)
        self.actionQuit.setShortcut(
            QCoreApplication.translate("MainWindow", u"Ctrl+Q", None))
# endif // QT_CONFIG(shortcut)
        """
        这段代码的作用是:使用 QTabWidget 的 setTabText 方法,通过 indexOf() 方法找到名为 self.bookmarkTab 的页面的索引,然后调用 QCoreApplication.translate() 方法来获取翻译后的文本(如果没有启用国际化,它将返回原始文本),并将其设置为该页面的选项卡标题。这种用法在 Qt 应用程序中非常常见,特别是在需要本地化应用程序时,可以通过改变翻译文件来支持不同的语言,而不需要修改代码。
        """
        self.tabWidget.setTabText(self.tabWidget.indexOf(
            self.bookmarkTab), QCoreApplication.translate("MainWindow", u"Pages", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(
            self.pagesTab), QCoreApplication.translate("MainWindow", u"Bookmarks", None))
        self.qtFileMenu.setTitle(
            QCoreApplication.translate("MainWindow", u"文件", None))
        self.menuHelp.setTitle(
            QCoreApplication.translate("MainWindow", u"帮助", None))
        self.mainToolBar.setWindowTitle(
            QCoreApplication.translate("MainWindow", u"工具栏", None))
    # retranslateUi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法023:寻找旋转排序数组中的最小值

寻找旋转排序数组中的最小值. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/ 这个题乍一看可以用二分查找,并且…

天行健的精益生产方案有多强?点击一看究竟

众所周知,导入精益生产管理方法对企业来说是一种全新的变革,能为企业注入了全新的血液和活力,使濒临破产和倒闭的企业得以存活并迅速发展成长,提升企业的核心竞争力,甚至是成为行业的巨头和领跑者。具体方案如深圳天行…

这个大模型确实成功消除了我在论文阅读上的障碍

🐱 个人主页:TechCodeAI启航,公众号:TechCodeAI 🙋‍♂️ 作者简介:2020参加工作,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫 优质专…

图像压缩算法

8.1 JPEG压缩 (JPEG Compression) 介绍 JPEG(Joint Photographic Experts Group)压缩是最常用的有损图像压缩算法之一。它通过减少图像中的冗余数据来实现高效压缩,特别适用于自然图像。 原理 JPEG压缩的基本步骤包括颜色空间转换、离散余…

偏导数的可视化

偏导数的可视化 flyfish 函数 f ( x , y ) sin ⁡ ( x ) ⋅ cos ⁡ ( y ) f(x, y) \sin(x) \cdot \cos(y) f(x,y)sin(x)⋅cos(y) import numpy as np from sympy import lambdify, sin, cos from sympy.abc import x, y import matplotlib.pyplot as plt from mpl_toolk…

【Ubuntu24.04搭建turn服务器】

1.安装与启动 首先安装coturn sudo apt-get update -y sudo apt-get install coturn -y可以看到默认的TURN服务是不启动的 # Uncomment it if you want to have the turnserver running as an automatic system service daemon # #TURNSERVER_ENABLED1编辑配置文件取消注释 …

【区块链+食品安全】湖南省食品行业联合会:溯链中国—基于区块链的食品安全可信追溯平台 | FISCO BCOS应用案例

食品安全追溯体系的建设,能够切实加强食品安全监管,确保人民群众饮食安全和身体健康,是创建食品安全城市必不可少的一部分。然而,中心化存储、信息孤岛、窜货是传统溯源行业最大痛点。区块链技术的快速发展, 使得防伪溯…

42.【C语言】冒泡排序

目录: 冒泡排序 *核心思想 *分析 *代码 *优化 15.冒泡排序(bubble sort) *核心思想:两两相邻的元素进行比较,满足条件则两者交换 *分析 现要求升序排序 输入: 9 8 7 6 5 4 3 2 1 0 输出:0 1 2 3 4 5 6 7 8 9 下面展示一趟冒泡排…

NLP从零开始------9文本进阶处理之文本相似度计算

1.文本相似度计算简介 在自然语言处理中,经常会涉及度量两个文本相似度的问题。在诸如对话系统和信息减速等中,度量句子或短语之间的相似度尤为重要。在新闻学传媒中应用文本相似度可以帮助读者快速检索到想要了解的报道。 文本相似度的定义式如下所示&a…

江协科技STM32学习笔记(第08章 USART串口)

第08章 USART串口 8.1 USART串口协议 8.1.1 通信接口 在STM32中,集成了很多用于通信的外设模块,比如下表所列。 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 针对STM32内部没有的功能,比如蓝牙无…

04创建型设计模式——建造者模式

一、建造者模式简介 建造者模式(Builder Pattern)又被称为生成器模式。它旨在构建一个复杂对象的各个部分,而不需要指定该对象的具体类。该模式特别适用于对象的构建过程复杂且需要多个步骤的情况。建造者模式是一种对象创建型模式之一&…

【Mysql】mysql三种安装方式(二进制、yum、docker)

一、环境信息 centos7.6_x86、glib2.17 mysql官网下载地址:MySQL :: Download MySQL Community Server 二、 二进制安装 #下载解压安装包 [roothadoop03 ~]# wget -c https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz [ro…

PX4二次开发快速入门

文章目录 前言一、概述二、二次开发基础(自定义工作队列,自定义uorb)三、自定义串口驱动(添加一个毫米波雷达并定高)四、自定义I2C驱动(驱动一个oled显示屏)五、自定义参数六、自定义日志七、自…

机器学习笔记:编码器与解码器

目录 介绍 组成结构 代码实现 编码器 解码器 合并编码器-解码器 思考 介绍 在机器翻译中,输入的序列与输出的序列经常是长度不相等的序列,此时,像自然语言处理这种直接使用循环神经网络或是门控循环单元的方法就行不通了。因此&#x…

Qt 窗口:菜单、工具与状态栏的应用

目录 引言: 1. 菜单栏 1.1 创建菜单栏 1.2 在菜单栏中添加菜单 1.3 创建菜单项 1.4 在菜单项之间添加分割线 1.5 综合示例 2.工具栏 2.1 创建工具栏 2.2 设置停靠位置 2.3 设置浮动属性 2.4 设置移动属性 3. 状态栏 3.1 状态栏的创建 3.2 在状态栏中显…

Pytorch_cuda版本的在线安装命令

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 运行效果如下: 这个方法是直接从pytorch官网进行在线下载和安装。 cu121,表示当前您安装的cuda版本是12.1

java基础概念15-字符串

public static void main(String[] args) {String name "张三";name "李四";System.out.println(name);// 李四} name变量是一个引用变量,它存储的是对字符串对象的引用(即内存地址),而不是字符串对象本身的…

【Git】远程仓库新建分支后,拉到本地开发

1. 在远程仓库上创建分支 2. git fetch origin:在本地同步远程仓库的分支(获取远程仓库所有分支的所有修改) 3. git remote -a:查看所有分支(远程+本地) 4. git checkout -b 本地名 远程仓库…

华夏erp2.3代码审计

1 sql注入代码 该项目使用的是Mybits的数据库,直接在*.xml文件中全局搜索 ${我们选一个比较有可能有注入的 UserMapperEx.xml 进行查 看 回溯到UserMapperEx.java。 继续回溯到UserService.java。 继续回溯可以看到UserComponent.java中userName的值是从search中获取的。 在s…

CodeWave--创建实体与枚举

一、实体的创建 可视化开发左侧边栏选择数据模块,在实体菜单下,选择2处的“” ,即可创建一个默认的实体类,修改3处的实体名称,再在实体页签中,添加所需的字段即可。 注:id是自动生成的主键&…