第十四篇 -- 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", "英语"))
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_())
特别提醒一点的是可以自己在Property里面设置剪切-复制-粘贴等的初始状态disable,只需要去掉Enable那个属性的勾就好了。至于怎么使它Enable,对于PlainTextEdit控件来说,有一个槽函数copyAvailable可以设置他们的使能。另外那个customContextMenuRequested(pos)函数在这个程序里面还没发现什么作用,没有什么特别的功能,如果有人发现了,可以告诉我一下,哈哈哈。
第十四篇 -- QMainWindow与QAction(清空-全选-撤销-重做-关闭-语言选择)的更多相关文章
- 第十二篇 -- QMainWindow与QAction(剪切-复制-粘贴)
效果图: 按照上一节的方法,将剪切-复制-粘贴图标放置到工具栏后,为其指定槽函数.这些功能无需自己编写代码来实现,QPlainTextEdit提供了实现这些编辑功能的槽函数,如cut().copy() ...
- 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)
解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...
- 第十四篇 Integration Services:项目转换
本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业 ...
- Python之路【第十四篇】:AngularJS --暂无内容-待更新
Python之路[第十四篇]:AngularJS --暂无内容-待更新
- 【译】第十四篇 Integration Services:项目转换
本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业 ...
- 跟我学SpringCloud | 第十四篇:Spring Cloud Gateway高级应用
SpringCloud系列教程 | 第十四篇:Spring Cloud Gateway高级应用 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 ...
- SpringBoot第二十四篇:应用监控之Admin
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前一章(S ...
- Egret入门学习日记 --- 第十四篇(书中 5.4~5.6节 内容)
第十四篇(书中 5.4~5.6节 内容) 书中内容: 总结 5.4节 内容重点: 1.如何编写自定义组件? 跟着做: 重点1:如何编写自定义组件? 文中提到了重要的两点. 好,我们来试试看. 第一步, ...
- Spring Cloud第十四篇 | Api网关Zuul
本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...
随机推荐
- 十、构建memcached服务
装包-------配置----起服务---验证 装包: [root@proxy ~]# yum -y install memcached //安装软件包memcached [root@ ...
- 【逆向实战】ES文件浏览器未授权访问漏洞(CVE-2019-6447)具体分析及利用
/作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334 未经许可,禁止转载/ 漏洞简介 CVE-2019-6447是Android端上的一个知名软件:ES文件浏览器的 ...
- 『动善时』JMeter基础 — 44、JMeter对数据库的更新操作
目录 1.执行一条insert语句 2.insert语句实现参数化 3.一次执行多条insert语句 4.使用Beanshell生成加密数据示例 (1)测试计划内包含的元件 (2)JDBC连接配置组件 ...
- 基于 Spring Security 的前后端分离的权限控制系统
话不多说,入正题.一个简单的权限控制系统需要考虑的问题如下: 权限如何加载 权限匹配规则 登录 1. 引入maven依赖 1 <?xml version="1.0" enc ...
- MIT6.828-LAB1 : PC启动
Lab1 1. 先熟悉PC的物理地址空间 这里其实有很多可以说的,不过先简单描述一下吧.从0x00000000到0x00100000这1mb的地址空间时机器处于16位的实模式.也就是说这个时候机器的汇 ...
- Kafka 总结学习
Kafka Need No Keeper 最近在鹅厂工作中不断接触到Kafka,虽然以前也使用过,但是对其架构和发展过程总是模模糊糊,所以在回学校准备末考的时候找些资料总结一下. Kafka Need ...
- 生成工作区设置文件settings.json
先Ctrl+Shift+P,然后输入setting搜索 找到工作区设置(工作区,仅在当前打开的界面下生效,文档位置与根目录/.vscode/setting.json(可自己创建,也可不创建)) 选择之 ...
- 第二篇CTF-MISC
第一篇写成了日记,发布不了.第一篇CTF-MISC 04.坚持60S 附件下载下来,是个jar的文件,打开 耶?这是嘛呀? 反正没看懂,既然是jar文件,直接上jd-gui反编译一波试试 这么明显的f ...
- QT 之 ODBC连接人大金仓数据库
QT 之 使用 ODBC 驱动连接人大金仓数据库 获取数据库驱动和依赖动态库 此操作可在人大金仓官网下载与系统匹配的接口动态库,或者从架构数据库的源码中获取驱动和依赖动态库 分别为: 驱动动态库:kd ...
- 与KubernetesAPI服务器交互
在介绍过的Downward API提供了一种简单的方式,将pod和容器的元数据传递给在它们内部运行的进程.但这种方式其实仅仅可以暴露一个pod自身的元数据,而且只可以暴露部分元数据.某些情况下,应用需 ...