zoukankan      html  css  js  c++  java
  • 第十四篇 -- QMainWindow与QAction(清空-全选-撤销-重做-关闭-语言选择)

    效果图:

    这次添加了关闭-撤销-重做-全选-清空等功能,并添加了字体和字体大小选择。基本方法跟前面几篇类似。

    ui_mainWindow.py

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'ui_mainWindow.ui'
    #
    # Created by: PyQt5 UI code generator 5.13.0
    #
    # WARNING! All changes made in this file will be lost!
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(691, 367)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
            self.plainTextEdit.setGeometry(QtCore.QRect(0, 0, 691, 291))
            font = QtGui.QFont()
            font.setPointSize(18)
            self.plainTextEdit.setFont(font)
            self.plainTextEdit.setObjectName("plainTextEdit")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 691, 21))
            self.menubar.setObjectName("menubar")
            self.menu = QtWidgets.QMenu(self.menubar)
            self.menu.setObjectName("menu")
            self.menu_2 = QtWidgets.QMenu(self.menubar)
            self.menu_2.setObjectName("menu_2")
            self.menu_3 = QtWidgets.QMenu(self.menubar)
            self.menu_3.setObjectName("menu_3")
            MainWindow.setMenuBar(self.menubar)
            self.toolBar = QtWidgets.QToolBar(MainWindow)
            self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
            self.toolBar.setObjectName("toolBar")
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
            self.statusBar = QtWidgets.QStatusBar(MainWindow)
            self.statusBar.setObjectName("statusBar")
            MainWindow.setStatusBar(self.statusBar)
            self.actFont_Italic = QtWidgets.QAction(MainWindow)
            self.actFont_Italic.setCheckable(True)
            icon = QtGui.QIcon()
            icon.addPixmap(QtGui.QPixmap("icons/images/Italic.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actFont_Italic.setIcon(icon)
            self.actFont_Italic.setObjectName("actFont_Italic")
            self.actFont_Bold = QtWidgets.QAction(MainWindow)
            self.actFont_Bold.setCheckable(True)
            icon1 = QtGui.QIcon()
            icon1.addPixmap(QtGui.QPixmap("icons/images/Bold.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actFont_Bold.setIcon(icon1)
            self.actFont_Bold.setObjectName("actFont_Bold")
            self.actFont_Underline = QtWidgets.QAction(MainWindow)
            self.actFont_Underline.setCheckable(True)
            icon2 = QtGui.QIcon()
            icon2.addPixmap(QtGui.QPixmap("icons/images/underline.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actFont_Underline.setIcon(icon2)
            self.actFont_Underline.setObjectName("actFont_Underline")
            self.actEdit_Cut = QtWidgets.QAction(MainWindow)
            self.actEdit_Cut.setEnabled(False)
            icon3 = QtGui.QIcon()
            icon3.addPixmap(QtGui.QPixmap("icons/images/cut.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actEdit_Cut.setIcon(icon3)
            self.actEdit_Cut.setObjectName("actEdit_Cut")
            self.actEdit_Copy = QtWidgets.QAction(MainWindow)
            self.actEdit_Copy.setEnabled(False)
            icon4 = QtGui.QIcon()
            icon4.addPixmap(QtGui.QPixmap("icons/images/copy.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actEdit_Copy.setIcon(icon4)
            self.actEdit_Copy.setObjectName("actEdit_Copy")
            self.actEdit_Paste = QtWidgets.QAction(MainWindow)
            self.actEdit_Paste.setEnabled(False)
            icon5 = QtGui.QIcon()
            icon5.addPixmap(QtGui.QPixmap("icons/images/paste.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actEdit_Paste.setIcon(icon5)
            self.actEdit_Paste.setObjectName("actEdit_Paste")
            self.actFile_New = QtWidgets.QAction(MainWindow)
            icon6 = QtGui.QIcon()
            icon6.addPixmap(QtGui.QPixmap("icons/images/new.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actFile_New.setIcon(icon6)
            self.actFile_New.setObjectName("actFile_New")
            self.actFile_Open = QtWidgets.QAction(MainWindow)
            icon7 = QtGui.QIcon()
            icon7.addPixmap(QtGui.QPixmap("icons/images/open.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actFile_Open.setIcon(icon7)
            self.actFile_Open.setObjectName("actFile_Open")
            self.actFile_Save = QtWidgets.QAction(MainWindow)
            icon8 = QtGui.QIcon()
            icon8.addPixmap(QtGui.QPixmap("icons/images/save.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actFile_Save.setIcon(icon8)
            self.actFile_Save.setObjectName("actFile_Save")
            self.actClose = QtWidgets.QAction(MainWindow)
            icon9 = QtGui.QIcon()
            icon9.addPixmap(QtGui.QPixmap("icons/images/close.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actClose.setIcon(icon9)
            self.actClose.setObjectName("actClose")
            self.actEdit_Undo = QtWidgets.QAction(MainWindow)
            self.actEdit_Undo.setEnabled(False)
            icon10 = QtGui.QIcon()
            icon10.addPixmap(QtGui.QPixmap("icons/images/undo.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actEdit_Undo.setIcon(icon10)
            self.actEdit_Undo.setObjectName("actEdit_Undo")
            self.acEdit_Redo = QtWidgets.QAction(MainWindow)
            self.acEdit_Redo.setEnabled(False)
            icon11 = QtGui.QIcon()
            icon11.addPixmap(QtGui.QPixmap("icons/images/redo.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.acEdit_Redo.setIcon(icon11)
            self.acEdit_Redo.setObjectName("acEdit_Redo")
            self.actEdit_Clear = QtWidgets.QAction(MainWindow)
            icon12 = QtGui.QIcon()
            icon12.addPixmap(QtGui.QPixmap("icons/images/clear.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actEdit_Clear.setIcon(icon12)
            self.actEdit_Clear.setObjectName("actEdit_Clear")
            self.actEdit_SelectAll = QtWidgets.QAction(MainWindow)
            self.actEdit_SelectAll.setObjectName("actEdit_SelectAll")
            self.actLang_CN = QtWidgets.QAction(MainWindow)
            self.actLang_CN.setCheckable(True)
            icon13 = QtGui.QIcon()
            icon13.addPixmap(QtGui.QPixmap("icons/images/chinese.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actLang_CN.setIcon(icon13)
            self.actLang_CN.setObjectName("actLang_CN")
            self.actLang_EN = QtWidgets.QAction(MainWindow)
            self.actLang_EN.setCheckable(True)
            icon14 = QtGui.QIcon()
            icon14.addPixmap(QtGui.QPixmap("icons/images/English.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actLang_EN.setIcon(icon14)
            self.actLang_EN.setObjectName("actLang_EN")
            self.menu.addAction(self.actFile_New)
            self.menu.addAction(self.actFile_Open)
            self.menu.addAction(self.actFile_Save)
            self.menu.addSeparator()
            self.menu.addAction(self.actClose)
            self.menu_2.addAction(self.actEdit_Cut)
            self.menu_2.addAction(self.actEdit_Copy)
            self.menu_2.addAction(self.actEdit_Paste)
            self.menu_2.addSeparator()
            self.menu_2.addAction(self.actEdit_Undo)
            self.menu_2.addAction(self.acEdit_Redo)
            self.menu_2.addSeparator()
            self.menu_2.addAction(self.actEdit_SelectAll)
            self.menu_2.addAction(self.actEdit_Clear)
            self.menu_3.addAction(self.actFont_Italic)
            self.menu_3.addAction(self.actFont_Bold)
            self.menu_3.addAction(self.actFont_Underline)
            self.menu_3.addSeparator()
            self.menubar.addAction(self.menu.menuAction())
            self.menubar.addAction(self.menu_2.menuAction())
            self.menubar.addAction(self.menu_3.menuAction())
            self.toolBar.addAction(self.actFile_New)
            self.toolBar.addAction(self.actFile_Open)
            self.toolBar.addAction(self.actFile_Save)
            self.toolBar.addSeparator()
            self.toolBar.addAction(self.actEdit_Cut)
            self.toolBar.addAction(self.actEdit_Copy)
            self.toolBar.addAction(self.actEdit_Paste)
            self.toolBar.addSeparator()
            self.toolBar.addAction(self.actEdit_Undo)
            self.toolBar.addAction(self.acEdit_Redo)
            self.toolBar.addSeparator()
            self.toolBar.addAction(self.actFont_Italic)
            self.toolBar.addAction(self.actFont_Bold)
            self.toolBar.addAction(self.actFont_Underline)
            self.toolBar.addSeparator()
            self.toolBar.addAction(self.actLang_CN)
            self.toolBar.addAction(self.actLang_EN)
            self.toolBar.addSeparator()
    
            self.retranslateUi(MainWindow)
            self.actEdit_Cut.triggered.connect(self.plainTextEdit.cut)
            self.actEdit_Copy.triggered.connect(self.plainTextEdit.copy)
            self.actEdit_Paste.triggered.connect(self.plainTextEdit.paste)
            self.actClose.triggered.connect(MainWindow.close)
            self.actEdit_Undo.triggered.connect(self.plainTextEdit.undo)
            self.acEdit_Redo.triggered.connect(self.plainTextEdit.redo)
            self.actEdit_Clear.triggered.connect(self.plainTextEdit.clear)
            self.actEdit_SelectAll.triggered.connect(self.plainTextEdit.selectAll)
            self.plainTextEdit.undoAvailable['bool'].connect(self.actEdit_Undo.setEnabled)
            self.plainTextEdit.redoAvailable['bool'].connect(self.acEdit_Redo.setEnabled)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menu.setTitle(_translate("MainWindow", "文件(F)"))
            self.menu_2.setTitle(_translate("MainWindow", "编辑(E)"))
            self.menu_3.setTitle(_translate("MainWindow", "格式(M)"))
            self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
            self.actFont_Italic.setText(_translate("MainWindow", "斜体"))
            self.actFont_Italic.setToolTip(_translate("MainWindow", "<html><head/><body><p><span style=" font-style:italic;">斜体</span></p></body></html>"))
            self.actFont_Bold.setText(_translate("MainWindow", "粗体"))
            self.actFont_Bold.setToolTip(_translate("MainWindow", "加粗"))
            self.actFont_Underline.setText(_translate("MainWindow", "下划线"))
            self.actFont_Underline.setToolTip(_translate("MainWindow", "下划线"))
            self.actEdit_Cut.setText(_translate("MainWindow", "剪切"))
            self.actEdit_Cut.setToolTip(_translate("MainWindow", "剪切到粘贴板"))
            self.actEdit_Cut.setShortcut(_translate("MainWindow", "Ctrl+X"))
            self.actEdit_Copy.setText(_translate("MainWindow", "复制"))
            self.actEdit_Copy.setToolTip(_translate("MainWindow", "复制到粘贴板"))
            self.actEdit_Copy.setShortcut(_translate("MainWindow", "Ctrl+C"))
            self.actEdit_Paste.setText(_translate("MainWindow", "粘贴"))
            self.actEdit_Paste.setToolTip(_translate("MainWindow", "从粘贴板粘贴"))
            self.actEdit_Paste.setShortcut(_translate("MainWindow", "Ctrl+V"))
            self.actFile_New.setText(_translate("MainWindow", "新建"))
            self.actFile_New.setToolTip(_translate("MainWindow", "新建文件"))
            self.actFile_New.setShortcut(_translate("MainWindow", "Ctrl+N"))
            self.actFile_Open.setText(_translate("MainWindow", "打开..."))
            self.actFile_Open.setToolTip(_translate("MainWindow", "打开文件"))
            self.actFile_Open.setShortcut(_translate("MainWindow", "Ctrl+O"))
            self.actFile_Save.setText(_translate("MainWindow", "保存"))
            self.actFile_Save.setToolTip(_translate("MainWindow", "保存修改"))
            self.actFile_Save.setShortcut(_translate("MainWindow", "Ctrl+S"))
            self.actClose.setText(_translate("MainWindow", "关闭"))
            self.actClose.setToolTip(_translate("MainWindow", "关闭本窗口"))
            self.actEdit_Undo.setText(_translate("MainWindow", "撤销"))
            self.actEdit_Undo.setToolTip(_translate("MainWindow", "撤销上次编辑操作"))
            self.actEdit_Undo.setShortcut(_translate("MainWindow", "Ctrl+Z"))
            self.acEdit_Redo.setText(_translate("MainWindow", "重做"))
            self.acEdit_Redo.setToolTip(_translate("MainWindow", "重做上次操作"))
            self.acEdit_Redo.setShortcut(_translate("MainWindow", "Ctrl+Y"))
            self.actEdit_Clear.setText(_translate("MainWindow", "清空"))
            self.actEdit_Clear.setToolTip(_translate("MainWindow", "清空"))
            self.actEdit_SelectAll.setText(_translate("MainWindow", "全选"))
            self.actEdit_SelectAll.setToolTip(_translate("MainWindow", "全选"))
            self.actEdit_SelectAll.setShortcut(_translate("MainWindow", "Ctrl+A"))
            self.actLang_CN.setText(_translate("MainWindow", "汉语"))
            self.actLang_CN.setToolTip(_translate("MainWindow", "汉语界面"))
            self.actLang_EN.setText(_translate("MainWindow", "英语"))
            self.actLang_EN.setToolTip(_translate("MainWindow", "英语"))
    View Code

    myMainWindow.py

    #!/usr/bin/env python
    # _*_ coding: UTF-8 _*_
    """=================================================
    @Project -> File    : Operate-system -> myMainWindow.py
    @IDE     : PyCharm
    @Author  : zihan
    @Date    : 2020/4/11 14:44
    @Desc    :
    ================================================="""
    
    import sys
    from PyQt5.QtWidgets import (QApplication, QMainWindow, QActionGroup, QLabel, QProgressBar, QSpinBox, QFontComboBox)
    from PyQt5.QtCore import Qt, pyqtSlot
    from PyQt5.QtGui import QTextCharFormat, QFont
    
    from ui_mainWindow import Ui_MainWindow
    
    
    class QmyMainWindow(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    
            self.__buildUI()
    
            # 设置斜体
            self.ui.actFont_Italic.triggered.connect(self.do_act_font_italic_triggered)
            # 设置粗体
            self.ui.actFont_Bold.triggered.connect(self.do_act_font_bold_triggered)
            # 设置下划线
            self.ui.actFont_Underline.triggered.connect(self.do_act_underline_triggered)
    
            # 新建文件
            self.ui.actFile_New.triggered.connect(self.do_act_file_new_triggered)
            # 打开文件
            self.ui.actFile_Open.triggered.connect(self.do_act_file_open_triggered)
            # 保存文件
            self.ui.actFile_Save.triggered.connect(self.do_act_file_save_triggered)
    
            # 设置字体大小
            self.__spinFontSize.valueChanged[int].connect(self.do_fontsize_changed)
            # 字体选择
            self.__comboFontName.currentIndexChanged[str].connect(self.do_fontname_changed)
    
            # 文本框内容可复制
            self.ui.plainTextEdit.copyAvailable.connect(self.do_plain_textedit_copyavailable)
            # 文本选择内容发生改变
            self.ui.plainTextEdit.selectionChanged.connect(self.do_plain_textedit_selectionchanged)
            # 标准右键菜单
            self.ui.plainTextEdit.customContextMenuRequested.connect(self.do_plain_textedit_customctmnreq)
    
            self.setCentralWidget(self.ui.plainTextEdit)
    
        def __buildUI(self):  # 窗体上动态添加组件
            # 创建状态栏上的组件
            self.__LabFile = QLabel(self)  # QLabel组件显示信息
            self.__LabFile.setMinimumWidth(150)
            self.__LabFile.setText("文件名:")
            self.ui.statusBar.addWidget(self.__LabFile)  # 添加到状态栏
    
            self.__progressBar1 = QProgressBar(self)
            self.__progressBar1.setMaximumWidth(200)
            self.__progressBar1.setMinimum(5)
            self.__progressBar1.setMaximum(50)
            sz = self.ui.plainTextEdit.font().pointSize()  # 字体大小
            self.__progressBar1.setValue(sz)
            self.ui.statusBar.addWidget(self.__progressBar1)  # 添加到状态栏
    
            self.__LabInfo = QLabel(self)  # QLabel组件显示字体名称
            self.__LabInfo.setText("选择字体名称:")
            self.ui.statusBar.addPermanentWidget(self.__LabInfo)  # 添加到状态栏
    
            # 为actLang_CN和actLang_EN创建QActionGroup,互斥型选择
            actionGroup = QActionGroup(self)
            actionGroup.addAction(self.ui.actLang_CN)
            actionGroup.addAction(self.ui.actLang_EN)
            actionGroup.setExclusive(True)  # 互斥型分组
            self.ui.actLang_CN.setChecked(True)
    
            # 创建工具我是谁,我在哪儿栏上的组件
            self.__spinFontSize = QSpinBox(self)  # 字体大小spinBox
            self.__spinFontSize.setMinimum(5)
            self.__spinFontSize.setMaximum(50)
            sz = self.ui.plainTextEdit.font().pointSize()
            self.__spinFontSize.setValue(sz)
            self.__spinFontSize.setMinimumWidth(50)
            self.ui.toolBar.addWidget(self.__spinFontSize)  # 添加到工具栏
    
            self.__comboFontName = QFontComboBox(self)  # 字体comboBox
            self.__comboFontName.setMinimumWidth(100)
            self.ui.toolBar.addWidget(self.__comboFontName)  # 添加到工具栏
    
            self.ui.toolBar.addSeparator()  # 添加一个分隔条
            self.ui.toolBar.addAction(self.ui.actClose)  # 添加一个关闭按钮
    
        @pyqtSlot(bool)
        def do_act_font_italic_triggered(self, checked):  # 斜体
            fmt = self.ui.plainTextEdit.currentCharFormat()
            fmt.setFontItalic(checked)
            self.ui.plainTextEdit.mergeCurrentCharFormat(fmt)
    
        @pyqtSlot(bool)
        def do_act_font_bold_triggered(self, checked):  # 粗体
            fmt = self.ui.plainTextEdit.currentCharFormat()
            if checked:
                fmt.setFontWeight(QFont.Bold)
            else:
                fmt.setFontWeight(QFont.Normal)
            self.ui.plainTextEdit.mergeCurrentCharFormat(fmt)
    
        @pyqtSlot(bool)
        def do_act_underline_triggered(self, checked):  # 下划线
            fmt = self.ui.plainTextEdit.currentCharFormat()
            fmt.setFontUnderline(checked)
            self.ui.plainTextEdit.mergeCurrentCharFormat(fmt)
    
        def do_act_file_new_triggered(self):  # 新建文件,不实现具体功能
            self.__LabFile.setText(" 新建文件")
    
        def do_act_file_open_triggered(self):  # 打开文件,不实现具体功能
            self.__LabFile.setText(" 打开的文件")
    
        def do_act_file_save_triggered(self):  # 保存文件,不实现具体功能
            self.__LabFile.setText(" 文件已保存")
    
        @pyqtSlot(int)
        def do_fontsize_changed(self, fontSize):  # 设置字体大小
            fmt = self.ui.plainTextEdit.currentCharFormat()
            fmt.setFontPointSize(fontSize)
            self.ui.plainTextEdit.mergeCurrentCharFormat(fmt)
            self.__progressBar1.setValue(fontSize)
    
        @pyqtSlot(str)
        def do_fontname_changed(self, fontName):  # 设置字体
            fmt = self.ui.plainTextEdit.currentCharFormat()
            fmt.setFontFamily(fontName)
            self.ui.plainTextEdit.mergeCurrentCharFormat(fmt)
            self.__LabInfo.setText("字体名称:%s    " % fontName)
    
        # 文本内容可复制
        def do_plain_textedit_copyavailable(self, avi):
            self.ui.actEdit_Cut.setEnabled(avi)
            self.ui.actEdit_Copy.setEnabled(avi)
            self.ui.actEdit_Paste.setEnabled(self.ui.plainTextEdit.canPaste())
    
        # 文本选择内容发生改变时
        def do_plain_textedit_selectionchanged(self):
            fmt = self.ui.plainTextEdit.currentCharFormat()
            self.ui.actFont_Bold.setChecked(fmt.font().bold())
            self.ui.actFont_Italic.setChecked(fmt.fontItalic())
            self.ui.actFont_Underline.setChecked(fmt.fontUnderline())
    
        # 标准右键菜单
        def do_plain_textedit_customctmnreq(self, pos):
            popMenu = self.ui.plainTextEdit.createStandardContextMenu()
            popMenu.exec(pos)  # 显示快捷菜单
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)  # 创建app,用QApplication类
        form = QmyMainWindow()
        form.show()
        sys.exit(app.exec_())
    View Code

    特别提醒一点的是可以自己在Property里面设置剪切-复制-粘贴等的初始状态disable,只需要去掉Enable那个属性的勾就好了。至于怎么使它Enable,对于PlainTextEdit控件来说,有一个槽函数copyAvailable可以设置他们的使能。另外那个customContextMenuRequested(pos)函数在这个程序里面还没发现什么作用,没有什么特别的功能,如果有人发现了,可以告诉我一下,哈哈哈。

  • 相关阅读:
    加解密工具类(含keystore导出pfx)
    Java使用数字证书加密通信(加解密/加签验签)
    关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
    产生定长的随机数
    数字证书生成--加密密/加签验签
    随机指定范围内N个不重复的数
    sql2012还原sql2008备份文件语句
    uploadify API
    海量数据处理分析
    .net经验积累
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/12692523.html
Copyright © 2011-2022 走看看