上上篇文章的链接:
(1条消息) PyQt5的笔记(上)_我行我素,向往自由的博客-CSDN博客
上篇文章的链接:
(1条消息) PyQt5的笔记(中-1)_我行我素,向往自由的博客-CSDN博客
目录
12.QFrame
13.QAbstractScrollArea
14.QTextEdit
14.1 占位提示文本
14.2 文本内容设置
14.3 自动格式化设置
14.4 软换行模式设置
14.5 覆盖模式的设置
14.6 光标的设置
14.7 对齐方式的设定
14.8 字体格式设置
14.9 字体颜色设置
14.10 当前字符格式的设置
14.11 常用编辑操作
14.12 滚动到锚点
14.13 只读设置
14.14 tab键位控制
14.15 打开超链接(锚点获取)
14.16 信号的使用
15.QPlainTextEdit
15.1 占位文本和只读和字符格式
15.2 软换行模式和覆盖模式和tab控制
15.3 文本操作
15.4 块的操作
15.5 常用编辑操作-放大缩小
15.6 滚动内容以显示光标
15.7 光标操作
15.8 信号
16.QkeySequenceEdit快捷键
16.1 功能作用
16.2 信号
17.步长调节器QAbstractSpinBox
17.1 子类化使用模拟
17.2 长按累加加速
17.3 只读设置
17.4 设置以及获取控件内容
17.5 对齐方式和设置周围框架和清空文本框内容
17.6 内容验证
17.7 信号
18.QSpinBox
18.1 最大值最小值范围编辑
18.2 数值循环
18.3 步长设置
18.4 前缀后缀和特殊文本
18.5 进制设置
18.6 值的设置与获取
18.7 自定义展示格式
18.8 信号
19.QDoubleSpinBox
19.1 功能作用
19.2 信号
20.QDateTimeEdit
20.1 QDateTime、QDate和QTime简单使用
20.1.1 QDateTime
20.1.2 QDate
20.1.3 QTime
20.2 QDateTimeEdit构造函数
20.3 section操作
20.4 日期时间范围
20.5 是否弹出日历选择控件
20.6 获取日期时间
20.7 信号
21.QDateEdit和QTimeEdit
from PyQt5.Qt import *
import sys
app=QApplication(sys.argv)
window=QWidget()
window.setWindowTitle('QTextEdit父类功能测试')
window.resize(500,500)
te=QTextEdit('nini',window)#QTextEdit多行文本
te.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)#显示竖直滚动条
te.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)#显示水平滚动条
btn=QPushButton(window)
btn.setIcon(QIcon('图片/点击.png'))
te.setCornerWidget(btn)#在右下角设置按钮
btn.pressed.connect(lambda:print('给你点这个赞。'))
window.show()
sys.exit(app.exec_())
效果展示:
多行文本编辑器。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QTextEdit功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.te=QTextEdit(self)
self.te.move(50,50)
self.te.resize(300,300)
self.te.setStyleSheet('background-color:cyan')
self.占位文本的提示()
def 占位文本的提示(self):
self.te.setPlaceholderText('请输入你的个人简介')#只有文本空的时候才会占位提示
print('获取占位文本信息:',self.te.placeholderText())
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
效果展示:
代码写到一起了,可自行查看测试。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QTextEdit功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.te=QTextEdit('xxx',self)#在构造函数中设置的文本内容,光标会跑到最前面
self.te.move(50,50)
self.te.resize(300,300)
self.te.setStyleSheet('background-color:cyan')
test_btn=QPushButton('测试按钮',self)
test_btn.move(10,10)
test_btn.pressed.connect(self.btn_test_cao)
# 建立表格
ttf = QTextTableFormat()
ttf.setCellPadding(6)
ttf.setCellSpacing(3)
self.te.textCursor().insertTable(5, 3, ttf)
def btn_test_cao(self):
# # 清空
# #self.te.setText('')
# self.te.clear()
# print(self.te.document())#返回一个QTextDocument对象
# print(self.te.textCursor())#
self.开始和结束操作()
def 开始和结束操作(self):
tc=self.te.textCursor()
tc.insertText('123')
tc.insertBlock()#插入段,相当于换行
tc.insertText('456')
tc.insertBlock()
tc.insertText('789')
tc.insertBlock()
def 位置相关(self):
tc=self.te.textCursor()
print('光标是否在段落的结尾:',tc.atBlockEnd())
print('光标是否在段落的开始:', tc.atBlockStart())
print('光标是否在文档的结尾:',tc.atEnd())
print('光标是否在文档的开始:',tc.atStart())
print('光标在第{}列'.format(tc.columnNumber()))
print('光标位置:', tc.position())
print('光标在文本块的位置:', tc.positionInBlock())
self.te.setFocus()
def 文本内容的删除(self):
tc=self.te.textCursor()
tc.deleteChar()#如果有选中文本,就删除选中文本;无,就删除光标后面的那个字符
tc.deletePreviousChar()#同上;删除前一个字符
self.te.setFocus()
def 文本的其他操作(self):
#获取选中位置
tc=self.te.textCursor()
print('选中开始位置:',tc.selectionStart())
print('选中结束位置:',tc.selectionEnd())
#清空
tc.clearSelection()#需要反向设置
self.te.setTextCursor(tc)
#是否有选中的文本 判定
print('是否有选中的文本:',tc.hasSelection())
#删除选中的【文本】内容
tc.removeSelectedText()#选中的是表格中的文本,也可以删除
self.te.setFocus()
def 占位文本的提示(self):
self.te.setPlaceholderText('请输入你的个人简介')#只有文本空的时候才会占位提示
print('获取占位文本信息:',self.te.placeholderText())#获得QTextCursor对象
def 文本内容的设置(self):
#设置纯文本
self.te.setPlainText("一级标题
")#设置普通文本,之前的内容被清空
self.te.insertPlainText('ddd')#从光标处开始插入
#设置富文本
self.te.setHtml("一级标题
")#设置了第一标题,所以和
没有显示
self.te.insertHtml('二级标题
')#二级标题
self.te.insertHtml('六级标题
')
#追加文本:不管光标在哪,都在最后末尾追加,区别insertPlainText
self.te.append('一级标题
')#会识别富文本
def 光标插入内容(self):
# #设置文本格式
# tcf=QTextCharFormat()#创建一个文本字符格式对象
# tcf.setToolTip("百度网址")
# tcf.setFontFamily('隶书')
# tcf.setFontPointSize(16)
#创建光标文本对象,进而操作
tc=self.te.textCursor()
# #插入普通文本内容
# tc.insertText('baidu.com',tcf)
# #插入超链接
# tc.insertHtml(' 百度 ')
# #插入图片
# tif=QTextImageFormat()
# tif.setName('图片/提示.png')
# tif.setWidth(100)
# tif.setHeight(100)
# #tc.insertImage(tif)
# #tc.insertImage(tif,QTextImageFormat.FloatRight)#可以设置位置,第二个参数
# tc.insertImage('图片/点击.png')#可以直接插入图片
# #插入句子
# tdf=QTextDocumentFragment.fromHtml('xxx
')#插入的是xxx
# tdf=QTextDocumentFragment.fromPlainText('xxx
')#插入的是原封不动的内容
# tc.insertFragment(tdf)
#插入列表
# tc.insertList(QTextListFormat.ListCircle)#插入的是圆圈圈,回车会有圆圈圈继续生成,就和标题一样
# tc.insertList(QTextListFormat.ListDecimal)#按照十进制升序,回车就会有序号
# tc.createList(QTextListFormat.ListDecimal)#创建列表,是吧光标所在的整个段落设置为一项
#设置插入列表样式
# tlf=QTextListFormat()
# tlf.setIndent(3)#缩进为三个tab键
# tlf.setNumberPrefix("<<")#设置前缀
# tlf.setNumberSuffix(">>")#设置后缀
# tlf.setStyle(QTextListFormat.ListDecimal)#设置样式
# tl=tc.createList(tlf)
# #插入表格,这里的表格类似于excel
# # tc.insertTable(5,3)#5行3列,返回的是表格对象
# ttf=QTextTableFormat()
# ttf.setAlignment(Qt.AlignRight)#右对齐
# ttf.setCellPadding(6)#单元格的内边距:单元格内的文本与内边框之间的距离
# ttf.setCellSpacing(3)#单元格的外边距,内边框与外边框的距离
# ttf.setColumnWidthConstraints((QTextLength(QTextLength.PercentageLength,50),QTextLength(QTextLength.PercentageLength,40),QTextLength(QTextLength.PercentageLength,10)))#限制列宽,有几列写几个元素,元组类型,这里的数字是百分比
# tc.insertTable(5,3,ttf)
# #插入文本快(段落,回车分割)
# tbf=QTextBlockFormat()#设置文本块格式
# tcf=QTextCharFormat()#设置字符格式
# tcf.setFontFamily('隶书')#设置字符字体样式
# tcf.setFontPointSize(60)#设置字体大小
# tbf.setAlignment(Qt.AlignRight)#设置对齐方式:右对齐
# tbf.setRightMargin(100)#设置右边距
# tbf.setIndent(3)#设置缩进长度:3个tab键
# tc.insertBlock(tbf,tcf)
# self.te.setFocus(True)
#插入文本框架
tff=QTextFrameFormat()
tff.setBorder(10)
tff.setBorderBrush(QColor(100,50,50))#设置颜色
tff.setRightMargin(50)#设置右边距
tc.insertFrame(tff)
doc=self.te.document()
root_frame=doc.rootFrame()#获得文本框架对象QTextFrame
root_frame.setFrameFormat(tff)#在上述小框架外又设置了一个框架
def 格式设置和合并(self):
tc=self.te.textCursor()
# # 设置块内字符格式
# tcf=QTextCharFormat()
# tcf.setFontFamily('幼圆')
# tcf.setFontPointSize(20)
# tcf.setFontOverline(True)#设置上划线
# tcf.setFontUnderline(True)#设置下划线
# tc.setBlockCharFormat(tcf)
# # 设置块的格式
# tbf=QTextBlockFormat()
# tbf.setAlignment(Qt.AlignCenter)#设置中间对齐方式
# tbf.setIndent(2)#缩进
# tc.setBlockFormat(tbf)
#合并
tcf2=QTextCharFormat()
tcf2.setFontStrikeOut(True)#删除线
#tc.setCharFormat(tcf2)#这个只会保留最近设置的新的格式
tc.mergeCharFormat(tcf2)#这个是在老的基础上再设置,即合并
def 获取内容和格式(self):
tc=self.te.textCursor()#获取文本光标
#QTextBlock()
print(tc.block().text())#获取当前光标所在的文本块,block()返回的是QTextBlock对象
print(tc.blockNumber())#获取段落编号
print(tc.currentList())#获取文本列表
def 文本选中与清空(self):
tc=self.te.textCursor()
#tc.setPosition(6,QTextCursor.KeepAnchor)#定位到第六个字符位置,第二个参数可以产生选中效果
tc.movePosition(QTextCursor.StartOfLine,QTextCursor.KeepAnchor,1)
self.te.setTextCursor(tc)#必须这样写,反向设置
self.te.setFocus()
def 文本选中内容的获取(self):
tc=self.te.textCursor()
print('选中的文本内容为:',tc.selectedText())
print(tc.selection())#返回QTextDocumentFragment
print(tc.selection().toPlainText())#转化为文本
#获取表格单元格数据
print(tc.selectedTableCells())#(开始行号,选中的行数,开始列号,选中的列号)
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
def 自动格式化(self):
self.te.setAutoFormatting(QTextEdit.AutoBulletList)
软换行:设置当用户输入内容过多时,是否进行软换行,以及如何进行软换行。
软换行当遇到一个单词被分割的时候,这个单词的上半部分会跑到下一行,从而保持了单词的完整性。
def 软换行模式(self):#什么也不设置的情况下,默认换行会保持单词的完整性
#取消软换行,即除非自己手动回车,均不换行,会有水平滚动条出现
#self.te.setLineWrapMode(QTextEdit.NoWrap)
# #设置宽度(像素)
# self.te.setLineWrapMode(QTextEdit.FixedPixelWidth)#FixedPixelWidth固定的像素宽度
# self.te.setLineWrapColumnOrWidth(100)#这里面的参数要么代表列数,要么代表像素值,取决于上述的枚举值
# #设置宽度(列数)
# self.te.setLineWrapMode(QTextEdit.FixedColumnWidth) # FixedPixelWidth固定的像素宽度
# self.te.setLineWrapColumnOrWidth(10) # 这里面的参数要么代表列数,要么代表像素值,取决于上述的枚举值
#保证单词的完整性
self.te.setWordWrapMode(QTextOption.WordWrap)#超过之后自动向下移
覆盖模式:就是当在光标处输入时,会自动覆盖住后面的内容。
def 覆盖模式的设置(self):
self.te.setOverwriteMode(True)
def 光标的设置(self):
print('当前光标宽度:',self.te.cursorWidth())
print(self.te.cursorRect(self.te.textCursor()))
if self.te.overwriteMode():#当前是覆盖模式,点击按钮变成不是覆盖模式,即窄光标
self.te.setOverwriteMode(False)#不再是宽光标模式
self.te.setCursorWidth(1) # 设置光标的宽度
else:#不是覆盖模式,点击按钮改成宽光标
self.te.setOverwriteMode(True)
self.te.setCursorWidth(10)
def 对齐方式(self):
self.te.setAlignment(Qt.AlignCenter)#设置当前段落的对齐方式,居中对齐
def 字体格式设置(self):
# #QFontDialog.getFont()
# self.te.setFontFamily('隶书')
# self.te.setFontPointSize(18)#字体尺寸
# self.te.setFontWeight(QFont.Black)#字体加粗
# self.te.setFontItalic(True)#设置倾斜
# self.te.setFontUnderline(True)#下划线
#或者通过下面方法设置
font=QFont()
font.setStrikeOut(True)#删除线
self.te.setCurrentFont(font)
颜色:字体颜色和背景颜色
def 字体颜色设置(self):
self.te.setTextBackgroundColor(QColor(200,10,10))#背景颜色 RGB
self.te.setTextColor(QColor(10,200,10))#字体颜色
def 字符设置(self):
tcf=QTextCharFormat()
tcf.setFontFamily('楷体')
tcf.setFontPointSize(18)#字体大小
tcf.setFontCapitalization(QFont.Capitalize)#首字母大写
tcf.setForeground(QColor(100,200,150))#设置前景颜色
self.te.setCurrentCharFormat(tcf)
tcf2=QTextCharFormat()
tcf2.setFontOverline(True)
self.te.setCurrentCharFormat(tcf2)
def 常用编辑操作(self):
# self.te.copy()#复制选中内容到剪贴板,其实然后再ctrl+v也可以操作
# self.te.paste()#粘贴
# print("当前是否可以进行粘贴:",self.te.canPaste())#即当前剪贴板是否有内容
# self.te.selectAll()#全选
self.te.find('xx',QTextDocument.FindBackward | QTextDocument.FindCaseSensitively | QTextDocument.FindWholeWords)#向后查找整个单词匹配的,忽略大小写, 返回bool类型
self.te.setFocus()
快速滚动到指定位置。
def 滚动到锚点(self):#快速滚动到指定位置
self.te = QTextEdit('xxx' * 300 + "廖科" + 'aaa' * 200,
self) # 在构造函数中设置的文本内容,光标会跑到最前面
self.te.scrollToAnchor('lk')#里面必须指定name
def 只读性质设置(self):
self.te.setReadOnly(True)#只读,仅仅是限制用户,而不限制代码设置
self.te.insertPlainText('张三')#代码插入
print('当前是否处于只读状态:',self.te.isReadOnly())
self.te.setTabChangesFocus(True)#制表符,对齐,一般都是8的倍数
测试效果:
def tab功能测试(self):
#self.te.setTabChangesFocus(True)#制表符,对齐,一般都是8的倍数
print(self.te.tabStopDistance())#默认值是80
print(self.te.tabStopWidth())
self.te.setTabStopDistance(100)
#打开超链接,需要监听信号(因为te对象里没有clicked之类的方法,所以需要类方法
class MyTextEdit(QTextEdit):
def mousePressEvent(self,me):#mouseEvent
print(me.pos())
link_str=self.anchorAt(me.pos())#获取地址
#获取到地址后,就打开链接
if len(link_str)>0:
QDesktopServices.openUrl(QUrl(link_str))
#信号的使用
self.te.textChanged.connect(lambda:print('文本内容发生改变'))#
self.te.selectionChanged.connect(lambda:print('文本选中内容发生改变'))
self.te.copyAvailable.connect(lambda yes:print('复制是否可用:',yes))#选中内容就是可用True
和QTextEdit差不多,只是对纯文本处理进行了优化,不支持富文本,不支持表格和嵌入框架。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QPlainTextEdit功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.pte=QPlainTextEdit(self)
self.pte.resize(300,300)
self.pte.move(100,100)
self.占位提示文本()
def 占位提示文本(self):
self.pte.setPlaceholderText('请输入你的个人信息')
print('占位提示信息为:',self.pte.placeholderText())
def 只读设置(self):
self.pte.setReadOnly(True)#只读
print('当前文本框是否是只读的:',self.pte.isReadOnly())
def 格式设置(self):
tcf=QTextCharFormat()
tcf.setFontUnderline(True)#设置下划线
tcf.setUnderlineColor(QColor(200,100,100))#指定下划线颜色
self.pte.setCurrentCharFormat(tcf)
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
效果展示:
def 软换行(self):
print(self.pte.lineWrapMode())#一行不够时,会自动换行
self.pte.setLineWrapMode((QPlainTextEdit.NoWrap))#不会换行,会一直输入,有水平滚轮
def 覆盖模式(self):
print('未设置覆盖模式之前的模式:',self.pte.overwriteMode())
self.pte.setOverwriteMode(True)#设置覆盖模式
print('设置覆盖模式之后的模式:', self.pte.overwriteMode())
def tab控制(self):
self.pte.setTabChangesFocus(True)
self.pte.setTabStopDistance(100)
def 文本操作(self):
self.pte.setPlainText('嘿嘿黑哈哈哈')
self.pte.setPlainText('123456789')#【重要】会将上行覆盖
self.pte.insertPlainText('9999999999')#不会覆盖,光标在哪插哪
self.pte.appendPlainText('百度')#原文本追加
self.pte.appendHtml('百度')#只有百度俩字
#不支持表格 但可以用html格式插入,但是表格并不会显示
table_str="" \
"1 2 3 " \
"4 5 6 " \
"
"#2行3列
self.pte.appendHtml(table_str)#无边框框
print('文本框里所有内容为:',self.pte.toPlainText())
效果展示:
def 块的操作(self):
print('当前文本框中块的个数:',self.pte.blockCount())#相当于一行为一块
self.pte.setMaximumBlockCount(4)#设置最大块数,多出的块会将第一行删去,不断地替换
def 常用编辑操作_放大缩小(self):
# #zoomIn() 将某一局部放大或缩小,没有参数是放大,正数为放大,负数为缩小
# self.pte.zoomIn(10)#【放大】
# #self.pte.zoomIn(-5)#【缩小】小到一定程度就不能缩小了
self.pte.zoomOut()#和zoomIn正好相反
def 滚动保证光标可见(self):
# #self.pte.setCenterOnScroll(True)这样可以做到绝对光标所在那一行滚动到中间
# self.pte.centerCursor()#滚动尽可能保证光标所在的那一行在中间位置
self.pte.ensureCursorVisible()#保证光标所在一行出现在事业里,滚轮移动最近
self.pte.setFocus()
def 光标的操作(self):
#tc=self.pte.textCursor()#拿到文本光标对象
#不可插入图片、表格之类的富文本
tc=self.pte.cursorForPosition(QPoint(100,60))#返回值是一个QTextCusor对象
#获得的位置可以操作 比如:插入
tc.insertText('朋友,我想你们了')
self.pte.setCursorWidth(20)#设置光标宽度
self.pte.moveCursor(QTextCursor.End,QTextCursor.KeepAnchor)#光标移动到末尾,并选中之前光标位置到末尾的文本
self.pte.setFocus()
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QPlainTextEdit功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.pte=QPlainTextEdit(self)
self.pte.resize(300,300)
self.pte.move(100,100)
test_btn=QPushButton(self)
test_btn.setText('测试按钮')
test_btn.move(20,20)
test_btn.clicked.connect(self.btn_test)
# 展示行号
line_num_parent = QWidget(self)
line_num_parent.resize(30,300)
line_num_parent.move(70,100)
line_num_parent.setStyleSheet('background-color:cyan;')
self.line_label=QLabel(line_num_parent)
self.line_label.move(0,8)
#展示1-100行
line_nums='\n'.join([str(i) for i in range(1,101)])
self.line_label.setText(line_nums)
self.line_label.adjustSize()#自适应大小
def btn_test(self):
self.信号的操作()
def 信号的操作(self):
self.pte.textChanged.connect(lambda :print('文本内容发生改变'))
self.pte.selectionChanged.connect(lambda:print('选中内容发生改变:',self.pte.textCursor().selectedText()))#会查看内容
self.pte.modificationChanged.connect(lambda val:print('修改状态发生改变:',val))
doc=self.pte.document()#拿到文本对象
doc.setModified(False)#修改编辑状态
self.pte.cursorPositionChanged.connect(lambda:print('光标位置发生改变'))
self.pte.blockCountChanged.connect(lambda num:print('块数发生改变:',num))#一个段落一个块
self.pte.updateRequest.connect(lambda rect,dy:self.line_label.move(self.line_label.x(),self.line_label.y()+dy))
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
作用:录制快捷键。用来描述一个键位序列,键位序列描述了必须一起使用以执行某些操作的键组合
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QKeySequenceEdit功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.kse=QKeySequenceEdit(self)
#ks=QKeySequence("Ctrl+C")
#或者1
#ks=QKeySequence(QKeySequence.Copy)
#或者2
#ks=QKeySequence(Qt.CTRL,Qt.Key_C)# <==> ks=QKeySequence(Qt.CTRL+Qt.Key_C)
#或者3
ks = QKeySequence(Qt.CTRL + Qt.Key_C,Qt.CTRL + Qt.Key_V)#<==>
self.kse.setKeySequence(ks)
self.kse.clear()
btn=QPushButton(self)
btn.move(100,100)
btn.setText('测试按钮')
btn.clicked.connect(lambda :print(self.kse.keySequence().toString(),self.kse.keySequence().count()))
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
运行效果:
#信号
self.kse.editingFinished.connect(lambda:print('结束编辑'))
self.kse.keySequenceChanged.connect(lambda key_val:print('键位序列发生变化:',key_val.toString()))
运行效果:
抽象类想要使用一定要子类化。
若想要上下箭头都可用,就用按位或即可。
from PyQt5.Qt import *
import sys
class MyASB(QAbstractSpinBox):
def __init__(self,parent=None,num="0",*args,**kwargs):
super().__init__(parent,*args,**kwargs)
self.lineEdit().setText(num)#设置初值
def stepEnabled(self):
#输入范围 0-9
current_num=int(self.text())
if current_num==0:#只向上有效
return QAbstractSpinBox.StepUpEnabled
elif current_num==9:#只向下有效
return QAbstractSpinBox.StepDownEnabled
elif current_num<0 or current_num>9:#均无效
return QAbstractSpinBox.StepNone
else:#向上向下均有效
return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
def stepBy(self, p_int):#p_int表示步长,传递的是1,若想改为其他值,可以乘
current_num=int(self.text())+p_int*2
self.lineEdit().setText(str(current_num))
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QAbstractSpinBox功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.asb=MyASB(self,"6")
self.asb.resize(100,30)
self.asb.move(100,100)
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
运行效果:
self.asb.setAccelerated(True)#长按加速,加速度不断变快
print('当前是否有加速度:',self.asb.isAccelerated())
这里的只读设置是指:不能通过键盘设置,只能通过步长调节器操作。
print('当前是否是只读的设置:',self.asb.isReadOnly())
self.asb.setReadOnly(True)
print('获取当前空间的内容:',self.asb.text())
print(self.asb.lineEdit().text())#与上行获取结果一样
self.asb.lineEdit().setText('999')
继承的许多方法都可以使用,具体可以自行查看,不再一一列举。
#设置自选匹配
cl=QCompleter(['123','12','342','999'],self.asb)
self.asb.lineEdit().setCompleter(cl)
#设置对齐方式
self.asb.lineEdit().setAlignment(Qt.AlignCenter)#居中对齐
运行效果:
#通过组合方式设置对齐方式
#self.asb.lineEdit().setAlignment(Qt.AlignCenter)#居中对齐
#或者 直接设置
self.asb.setAlignment(Qt.AlignCenter)
#设置周边框架
print('目前是否有框架:',self.asb.hasFrame())#默认就有边框框架,就是外围的黑框框
self.asb.setFrame(True)
#清空
self.asb.clear()
关键代码段:
def validate(self,p_str,p_int):#一旦文本框内容改变,就会自动调用该方法
#返回值是元组
#18-180
num=int(p_str)
if num<18:
return (QValidator.Intermediate,p_str,p_int)
elif num<=180:
return (QValidator.Acceptable,p_str,p_int)
else:
return (QValidator.Invalid,p_str,p_int)
def fixup(self,p_str):#修复方法,输入结束后还是Invalid,就自动调用该方法
return "18"
完整代码:
from PyQt5.Qt import *
import sys
class MyASB(QAbstractSpinBox):
def __init__(self,parent=None,num="0",*args,**kwargs):
super().__init__(parent,*args,**kwargs)
self.lineEdit().setText(num)#设置初值
def stepEnabled(self):
# #输入范围 0-9
# current_num=int(self.text())
# if current_num==0:#只向上有效
# return QAbstractSpinBox.StepUpEnabled
# elif current_num==9:#只向下有效
# return QAbstractSpinBox.StepDownEnabled
# elif current_num<0 or current_num>9:#均无效
# return QAbstractSpinBox.StepNone
# else:#向上向下均有效
# return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
def stepBy(self, p_int):#p_int表示步长,传递的是1,若想改为其他值,可以乘
current_num=int(self.text())+p_int*2
self.lineEdit().setText(str(current_num))
def validate(self,p_str,p_int):#一旦文本框内容改变,就会自动调用该方法
#返回值是元组
#18-180
num=int(p_str)
if num<18:
return (QValidator.Intermediate,p_str,p_int)
elif num<=180:
return (QValidator.Acceptable,p_str,p_int)
else:
return (QValidator.Invalid,p_str,p_int)
def fixup(self,p_str):#修复方法,输入结束后还是Invalid,就自动调用该方法
return "18"
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QAbstractSpinBox功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.asb=MyASB(self,"6")
self.asb.resize(100,30)
self.asb.move(100,100)
test_btn=QPushButton(self)
test_btn.move(200,200)
test_btn.setText('测试按钮')
test_btn.clicked.connect(self.btn_test)
# 长按加速,加速度不断变快
self.asb.setAccelerated(True)
print('当前是否有加速度:',self.asb.isAccelerated())
#只读设置
print('当前是否是只读的设置:',self.asb.isReadOnly())
self.asb.setReadOnly(False)
#设置自选匹配
cl=QCompleter(['123','12','342','999'],self.asb)
self.asb.lineEdit().setCompleter(cl)
#通过组合方式设置对齐方式
#self.asb.lineEdit().setAlignment(Qt.AlignCenter)#居中对齐
#或者 直接设置
self.asb.setAlignment(Qt.AlignCenter)
#设置周边框架
print('目前是否有框架:',self.asb.hasFrame())#默认就有边框框架,就是外围的黑框框
self.asb.setFrame(True)
#清空
#self.asb.clear()
def btn_test(self):
print('获取当前空间的内容:',self.asb.text())
print(self.asb.lineEdit().text())#与上行获取结果一样
self.asb.lineEdit().setText('999')
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
#信号
self.asb.editingFinished.connect(lambda:print('结束编辑'))
QSpinBox:主要用于处理整数和离散值集。
关键代码:
def 最大值最小值(self):
self.sb.setMaximum(66)
self.sb.setMinimum(20)#如果未设置内容,则默认值就是最小值
print('当前最大值为:',self.sb.maximum())
print('当前最小值为:', self.sb.minimum())
#或者:self.sb.setRange(20,66)
完整代码:
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QSpinBox功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.sb=QSpinBox(self)#什么也不做,默认数值会限制在0-99之间,只是数字
self.sb.resize(100,25)
self.sb.move(100,100)
self.最大值最小值()
def 最大值最小值(self):
self.sb.setMaximum(66)
self.sb.setMinimum(20)#如果未设置内容,则默认值就是最小值
print('当前最大值为:',self.sb.maximum())
print('当前最小值为:', self.sb.minimum())
#或者:self.sb.setRange(20,66)
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
当超过最大值,就会回到最小值。
def 数值循环(self):
print('当前是否允许循环:',self.sb.wrapping())
self.sb.setWrapping(True)
def 步长设置(self):
self.sb.setSingleStep(3)#3个3个的跳
def 前缀后缀的设置(self):
#设置1月到12月
self.sb.setRange(1,12)
self.sb.setSuffix('月')#后缀
#周六到周日
self.sb.setRange(0,6)
self.sb.setPrefix('周')#设置前缀
self.sb.setSpecialValueText('周日')#最小值会被替换成特殊文本“周日”
展示结果:
def 设置显示的进制(self):
#以二进制的形式显示数据
self.sb.setDisplayIntegerBase(2)
print('获取当前的进制:',self.sb.displayIntegerBase())
结果显示:
def 设置以及获取数值(self):
self.sb.setRange(0,9)
self.sb.setPrefix('第')
self.sb.setSuffix('名')
self.sb.setValue(66)#如果超出了设置范围,就会设定为默认最大或最小
print('当前的数值为:',self.sb.value())#【注意】并没有输出前后缀
print('当前文本框中的所有内容是:',self.sb.text())#包括前后缀
print('当前文本框中的所有内容是:',self.sb.lineEdit().text())#包括前后缀,同上
结果展示:
class SB(QSpinBox):
def textFromValue(self,p_int):#自定义格式,重写方法,p_int是文本框中的内容
#这里只是修改了展示内容,值并未改变
return str(p_int)+'*'+str(p_int)
除了继承父类QAbstractSpinBox的信号,还有自己特有的信号,如下:
self.sb.valueChanged[str].connect(lambda val:print('值发生了改变:',val))#[str]表明向外界传递的是字符串类型
与QSpinBox功能方面类似。
from PyQt5.Qt import *
import sys
class MyDoubleSB(QDoubleSpinBox):
def textFromValue(self,p_float):
return str(p_float)+'**'+str(p_float)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QDoubleSpinBox功能测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.dsb=MyDoubleSB(self)#默认范围0-99.99,步长为1.0
self.dsb.move(100,100)
self.dsb.resize(100,30)
#设置范围
self.dsb.setMaximum(88.88)
self.dsb.setMinimum(6.66)
self.dsb.setRange(6.66,88.88)
#设置步长
self.dsb.setSingleStep(0.02)
#设置循环
self.dsb.setWrapping(True)
#设置前后缀
self.dsb.setSuffix('$')#后缀
self.dsb.setPrefix('%')#前缀
# #设置特殊值文本 ==> 模拟倍速框
# self.dsb.setRange(1.0,2.0)#1.0 1.5 2.0
# self.dsb.setSingleStep(0.5)
# self.dsb.setSuffix('倍速')
# self.dsb.setSpecialValueText('正常倍速')#当值为最小值1.0的时候,显示的是“正常倍数”
# self.dsb.setWrapping(True)#循环
#设置小数位数
self.dsb.setDecimals(1)#一位小数
#设置和获取数值
test_btn=QPushButton(self)
test_btn.move(300,300)
test_btn.setText('测试按钮')
test_btn.clicked.connect(lambda :self.dsb.setValue(66.666))#如果设置位数为1位,则会四舍五入
test_btn.pressed.connect(lambda :print(type(self.dsb.value()),self.dsb.value()))#float value只包含值,不包含前后缀
test_btn.clicked.connect(lambda :print(type(self.dsb.text()),self.dsb.text()))#str 包含前后缀
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
运行结果:
#信号
self.dsb.valueChanged.connect(lambda val:print(val,type(val)))#float val结果不包含前后缀
self.dsb.valueChanged[str].connect(lambda val:print(val,type(val)))#str val结果包含前后缀
继承于QAbstractSpinBox
QDateTime、QDate、QTime三者相似。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('日期时间的学习')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
#dt=QDateTime(2022,7,17,21,46)#年 月 日 时 分
# self.dte=QDateTimeEdit(dt,self)
# self.dte.move(100,100)
# self.dte.resize(200,40)
dt=QDateTime.currentDateTime()
print('当前日期时间:',dt)#当前时间
print('当前时间加2年后:',dt.addYears(2))#加两年
#计算时间差
print('距离世界标准时间差{}小时'.format(dt.offsetFromUtc()//3600))#距离世界标准时间差,offsetFromUtc()返回结果是以秒为单位的
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
btn=QPushButton(self)
btn.setText('测试按钮')
btn.move(200,200)
btn.clicked.connect(lambda :print('到目前为止执行了{}ms。'.format(time.elapsed())))#从time.start()开始到现在执行time.elapsed().单位是毫秒
#QTime计时操作
time=QTime.currentTime()
time.start()#time.restart()是重新开始
运行结果:
self.dte=QDateTimeEdit(QDateTime.currentDateTime(),self)#将当前具体时间传进去
# self.dte=QDateTimeEdit(QDate.currentDate(),self)#将当前日期传进去
# self.dte=QDateTimeEdit(QTime.currentTime(),self)#将当前时钟传进去
def setup_ui(self):
self.dte=QDateTimeEdit(QDateTime.currentDateTime(),self)#将当前具体时间传进去
# self.dte=QDateTimeEdit(QDate.currentDate(),self)#将当前日期传进去
# self.dte=QDateTimeEdit(QTime.currentTime(),self)#将当前时钟传进去
self.dte.move(100,100)
self.dte.resize(170,40)
btn=QPushButton(self)
btn.setText('测试按钮')
btn.move(300,300)
# btn.pressed.connect(lambda:print('当前有{}部分组成。'.format(self.dte.sectionCount())))
btn.clicked.connect(self.test)
def test(self):
self.dte.setFocus()
self.dte.setCurrentSectionIndex(3)# 设置第三部分 0 1 2 3 4
print('第{}天'.format(self.dte.sectionText(QDateTimeEdit.DaySection)))#查看哪一天
#设置最大最小日期时间
self.dte.setMaximumDateTime(QDateTime(2024,7,17,11,59))#设置最大日期时间 年月日时分
self.dte.setMinimumDateTime(QDateTime.currentDateTime())#当前时间设置为最小时间
self.dte.setDateTimeRange(QDateTime.currentDateTime().addYears(-3),QDateTime.currentDateTime().addYears(3))
#日历选择控件
self.dte.setCalendarPopup(True)
运行效果:
#获取日期时间
print('当前日期时间:',self.dte.dateTime())
print('当前日期:', self.dte.date())
print('当前时间:', self.dte.time())
运行效果:
#信号
self.dte.dateTimeChanged.connect(lambda val:print('改变后的日期时间为:',val))
self.dte.dateChanged.connect(lambda val:print('改变后的日期为:',val))
均继承于QDateTimeEdit,所以不再详细演练了。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QDateEdit测试')
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.de=QDateEdit(self)
self.de.setDisplayFormat('yy-MMMM-dddd')
#获取日期
print('当前日期为:',self.de.date())#继承的父类方法
if __name__=='__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
运行效果: