PyQt5的笔记(中-2)

上上篇文章的链接:

(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


12.QFrame 

PyQt5的笔记(中-2)_第1张图片

PyQt5的笔记(中-2)_第2张图片

PyQt5的笔记(中-2)_第3张图片

PyQt5的笔记(中-2)_第4张图片

PyQt5的笔记(中-2)_第5张图片

PyQt5的笔记(中-2)_第6张图片

13.QAbstractScrollArea

PyQt5的笔记(中-2)_第7张图片

PyQt5的笔记(中-2)_第8张图片

PyQt5的笔记(中-2)_第9张图片

PyQt5的笔记(中-2)_第10张图片

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_())

效果展示:

PyQt5的笔记(中-2)_第11张图片

14.QTextEdit

PyQt5的笔记(中-2)_第12张图片

PyQt5的笔记(中-2)_第13张图片

PyQt5的笔记(中-2)_第14张图片

多行文本编辑器。 

14.1 占位提示文本

PyQt5的笔记(中-2)_第15张图片

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_())

效果展示:

PyQt5的笔记(中-2)_第16张图片

14.2 文本内容设置

PyQt5的笔记(中-2)_第17张图片PyQt5的笔记(中-2)_第18张图片

PyQt5的笔记(中-2)_第19张图片


PyQt5的笔记(中-2)_第20张图片

PyQt5的笔记(中-2)_第21张图片

PyQt5的笔记(中-2)_第22张图片

PyQt5的笔记(中-2)_第23张图片

PyQt5的笔记(中-2)_第24张图片

PyQt5的笔记(中-2)_第25张图片

PyQt5的笔记(中-2)_第26张图片

PyQt5的笔记(中-2)_第27张图片

PyQt5的笔记(中-2)_第28张图片PyQt5的笔记(中-2)_第29张图片

PyQt5的笔记(中-2)_第30张图片

代码写到一起了,可自行查看测试。 

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_())

14.3 自动格式化设置

def 自动格式化(self):
    self.te.setAutoFormatting(QTextEdit.AutoBulletList)

14.4 软换行模式设置

PyQt5的笔记(中-2)_第31张图片

软换行:设置当用户输入内容过多时,是否进行软换行,以及如何进行软换行。

软换行当遇到一个单词被分割的时候,这个单词的上半部分会跑到下一行,从而保持了单词的完整性。

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)#超过之后自动向下移

14.5 覆盖模式的设置

PyQt5的笔记(中-2)_第32张图片

覆盖模式:就是当在光标处输入时,会自动覆盖住后面的内容。 

def 覆盖模式的设置(self):
    self.te.setOverwriteMode(True)

14.6 光标的设置

PyQt5的笔记(中-2)_第33张图片

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)

14.7 对齐方式的设定

PyQt5的笔记(中-2)_第34张图片

def 对齐方式(self):
    self.te.setAlignment(Qt.AlignCenter)#设置当前段落的对齐方式,居中对齐

14.8 字体格式设置

 PyQt5的笔记(中-2)_第35张图片

PyQt5的笔记(中-2)_第36张图片

PyQt5的笔记(中-2)_第37张图片

PyQt5的笔记(中-2)_第38张图片

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)

14.9 字体颜色设置

PyQt5的笔记(中-2)_第39张图片

 颜色:字体颜色和背景颜色

def 字体颜色设置(self):
    self.te.setTextBackgroundColor(QColor(200,10,10))#背景颜色 RGB
    self.te.setTextColor(QColor(10,200,10))#字体颜色

14.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)

14.11 常用编辑操作

PyQt5的笔记(中-2)_第40张图片

PyQt5的笔记(中-2)_第41张图片

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()

14.12 滚动到锚点

快速滚动到指定位置。

def 滚动到锚点(self):#快速滚动到指定位置
    self.te = QTextEdit('xxx' * 300 + "廖科" + 'aaa' * 200,
                        self)  # 在构造函数中设置的文本内容,光标会跑到最前面
    self.te.scrollToAnchor('lk')#里面必须指定name

14.13 只读设置

def 只读性质设置(self):
    self.te.setReadOnly(True)#只读,仅仅是限制用户,而不限制代码设置
    self.te.insertPlainText('张三')#代码插入
    print('当前是否处于只读状态:',self.te.isReadOnly())

14.14 tab键位控制

PyQt5的笔记(中-2)_第42张图片

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)

14.15 打开超链接(锚点获取) 

PyQt5的笔记(中-2)_第43张图片

#打开超链接,需要监听信号(因为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))

14.16 信号的使用

PyQt5的笔记(中-2)_第44张图片

#信号的使用
self.te.textChanged.connect(lambda:print('文本内容发生改变'))#
self.te.selectionChanged.connect(lambda:print('文本选中内容发生改变'))
self.te.copyAvailable.connect(lambda yes:print('复制是否可用:',yes))#选中内容就是可用True

15.QPlainTextEdit

PyQt5的笔记(中-2)_第45张图片

和QTextEdit差不多,只是对纯文本处理进行了优化,不支持富文本,不支持表格和嵌入框架。

15.1  占位文本和只读和字符格式

PyQt5的笔记(中-2)_第46张图片

PyQt5的笔记(中-2)_第47张图片

PyQt5的笔记(中-2)_第48张图片

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_())

效果展示:

PyQt5的笔记(中-2)_第49张图片

15.2 软换行模式和覆盖模式和tab控制

PyQt5的笔记(中-2)_第50张图片

PyQt5的笔记(中-2)_第51张图片

PyQt5的笔记(中-2)_第52张图片

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)

15.3 文本操作

PyQt5的笔记(中-2)_第53张图片

def 文本操作(self):
    self.pte.setPlainText('嘿嘿黑哈哈哈')
    self.pte.setPlainText('123456789')#【重要】会将上行覆盖
    self.pte.insertPlainText('9999999999')#不会覆盖,光标在哪插哪
    self.pte.appendPlainText('百度')#原文本追加
    self.pte.appendHtml('百度')#只有百度俩字
    #不支持表格  但可以用html格式插入,但是表格并不会显示
    table_str="" \
              "" \
              "" \
              "
123
456
"#2行3列 self.pte.appendHtml(table_str)#无边框框 print('文本框里所有内容为:',self.pte.toPlainText())

效果展示:

PyQt5的笔记(中-2)_第54张图片

15.4 块的操作

PyQt5的笔记(中-2)_第55张图片

def 块的操作(self):
    print('当前文本框中块的个数:',self.pte.blockCount())#相当于一行为一块
    self.pte.setMaximumBlockCount(4)#设置最大块数,多出的块会将第一行删去,不断地替换
     

15.5 常用编辑操作-放大缩小

PyQt5的笔记(中-2)_第56张图片

def 常用编辑操作_放大缩小(self):
    # #zoomIn() 将某一局部放大或缩小,没有参数是放大,正数为放大,负数为缩小
    # self.pte.zoomIn(10)#【放大】
    # #self.pte.zoomIn(-5)#【缩小】小到一定程度就不能缩小了
    self.pte.zoomOut()#和zoomIn正好相反

15.6 滚动内容以显示光标

PyQt5的笔记(中-2)_第57张图片

def 滚动保证光标可见(self):
    # #self.pte.setCenterOnScroll(True)这样可以做到绝对光标所在那一行滚动到中间
    # self.pte.centerCursor()#滚动尽可能保证光标所在的那一行在中间位置
    self.pte.ensureCursorVisible()#保证光标所在一行出现在事业里,滚轮移动最近
    self.pte.setFocus()

15.7 光标操作

PyQt5的笔记(中-2)_第58张图片

PyQt5的笔记(中-2)_第59张图片

PyQt5的笔记(中-2)_第60张图片

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()

15.8 信号

PyQt5的笔记(中-2)_第61张图片

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_())

16.QkeySequenceEdit快捷键

PyQt5的笔记(中-2)_第62张图片

作用:录制快捷键。用来描述一个键位序列,键位序列描述了必须一起使用以执行某些操作的键组合

16.1 功能作用

PyQt5的笔记(中-2)_第63张图片 

PyQt5的笔记(中-2)_第64张图片

PyQt5的笔记(中-2)_第65张图片

PyQt5的笔记(中-2)_第66张图片

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_())

运行效果:

PyQt5的笔记(中-2)_第67张图片

16.2 信号

#信号
self.kse.editingFinished.connect(lambda:print('结束编辑'))
self.kse.keySequenceChanged.connect(lambda key_val:print('键位序列发生变化:',key_val.toString()))

运行效果:

PyQt5的笔记(中-2)_第68张图片

17.步长调节器QAbstractSpinBox

PyQt5的笔记(中-2)_第69张图片

抽象类想要使用一定要子类化。

17.1 子类化使用模拟 

PyQt5的笔记(中-2)_第70张图片

若想要上下箭头都可用,就用按位或即可。

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_())

运行效果:

PyQt5的笔记(中-2)_第71张图片

17.2 长按累加加速

PyQt5的笔记(中-2)_第72张图片

self.asb.setAccelerated(True)#长按加速,加速度不断变快
print('当前是否有加速度:',self.asb.isAccelerated())

17.3 只读设置

PyQt5的笔记(中-2)_第73张图片 

这里的只读设置是指:不能通过键盘设置,只能通过步长调节器操作。 

print('当前是否是只读的设置:',self.asb.isReadOnly())
self.asb.setReadOnly(True)

17.4 设置以及获取控件内容

PyQt5的笔记(中-2)_第74张图片 

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)#居中对齐

运行效果:

PyQt5的笔记(中-2)_第75张图片

17.5 对齐方式和设置周围框架和清空文本框内容

PyQt5的笔记(中-2)_第76张图片 

#通过组合方式设置对齐方式
#self.asb.lineEdit().setAlignment(Qt.AlignCenter)#居中对齐
#或者 直接设置
self.asb.setAlignment(Qt.AlignCenter)

PyQt5的笔记(中-2)_第77张图片

#设置周边框架
print('目前是否有框架:',self.asb.hasFrame())#默认就有边框框架,就是外围的黑框框
self.asb.setFrame(True)
#清空
self.asb.clear()

17.6 内容验证

PyQt5的笔记(中-2)_第78张图片

关键代码段:

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_())

17.7 信号

PyQt5的笔记(中-2)_第79张图片 

#信号
self.asb.editingFinished.connect(lambda:print('结束编辑'))

18.QSpinBox

PyQt5的笔记(中-2)_第80张图片

QSpinBox:主要用于处理整数和离散值集。 

18.1 最大值最小值范围
PyQt5的笔记(中-2)_第81张图片

关键代码:

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_())

18.2 数值循环

PyQt5的笔记(中-2)_第82张图片 

当超过最大值,就会回到最小值。 

def 数值循环(self):
    print('当前是否允许循环:',self.sb.wrapping())
    self.sb.setWrapping(True)

18.3 步长设置

PyQt5的笔记(中-2)_第83张图片 

def 步长设置(self):
    self.sb.setSingleStep(3)#3个3个的跳

18.4 前缀后缀和特殊文本

PyQt5的笔记(中-2)_第84张图片 

PyQt5的笔记(中-2)_第85张图片

def 前缀后缀的设置(self):
    #设置1月到12月
    self.sb.setRange(1,12)
    self.sb.setSuffix('月')#后缀
    #周六到周日
    self.sb.setRange(0,6)
    self.sb.setPrefix('周')#设置前缀
    self.sb.setSpecialValueText('周日')#最小值会被替换成特殊文本“周日”

展示结果:

PyQt5的笔记(中-2)_第86张图片 

18.5 进制设置 

PyQt5的笔记(中-2)_第87张图片 

def 设置显示的进制(self):
    #以二进制的形式显示数据
    self.sb.setDisplayIntegerBase(2)
    print('获取当前的进制:',self.sb.displayIntegerBase())

结果显示:

PyQt5的笔记(中-2)_第88张图片

18.6 值的设置与获取

PyQt5的笔记(中-2)_第89张图片

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())#包括前后缀,同上

结果展示: 

PyQt5的笔记(中-2)_第90张图片

18.7 自定义展示格式

PyQt5的笔记(中-2)_第91张图片

class SB(QSpinBox):
    def textFromValue(self,p_int):#自定义格式,重写方法,p_int是文本框中的内容
        #这里只是修改了展示内容,值并未改变
        return str(p_int)+'*'+str(p_int)

18.8 信号

除了继承父类QAbstractSpinBox的信号,还有自己特有的信号,如下: 

 

self.sb.valueChanged[str].connect(lambda val:print('值发生了改变:',val))#[str]表明向外界传递的是字符串类型

19.QDoubleSpinBox

与QSpinBox功能方面类似。 

PyQt5的笔记(中-2)_第92张图片

PyQt5的笔记(中-2)_第93张图片

19.1 功能作用

PyQt5的笔记(中-2)_第94张图片

PyQt5的笔记(中-2)_第95张图片

PyQt5的笔记(中-2)_第96张图片 

PyQt5的笔记(中-2)_第97张图片

PyQt5的笔记(中-2)_第98张图片

PyQt5的笔记(中-2)_第99张图片

PyQt5的笔记(中-2)_第100张图片

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_())

运行结果:

PyQt5的笔记(中-2)_第101张图片

19.2 信号 

 

#信号
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结果包含前后缀

20.QDateTimeEdit

PyQt5的笔记(中-2)_第102张图片 

继承于QAbstractSpinBox 

20.1 QDateTime、QDate和QTime简单使用

PyQt5的笔记(中-2)_第103张图片

QDateTime、QDate、QTime三者相似。 

20.1.1 QDateTime 

PyQt5的笔记(中-2)_第104张图片

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_())

运行结果:

20.1.2 QDate 

PyQt5的笔记(中-2)_第105张图片

20.1.3 QTime

PyQt5的笔记(中-2)_第106张图片

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()是重新开始

运行结果:

PyQt5的笔记(中-2)_第107张图片

20.2 QDateTimeEdit构造函数

PyQt5的笔记(中-2)_第108张图片

PyQt5的笔记(中-2)_第109张图片

self.dte=QDateTimeEdit(QDateTime.currentDateTime(),self)#将当前具体时间传进去
# self.dte=QDateTimeEdit(QDate.currentDate(),self)#将当前日期传进去
# self.dte=QDateTimeEdit(QTime.currentTime(),self)#将当前时钟传进去

20.3 section操作

PyQt5的笔记(中-2)_第110张图片

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)))#查看哪一天

20.4 日期时间范围 

PyQt5的笔记(中-2)_第111张图片

PyQt5的笔记(中-2)_第112张图片

PyQt5的笔记(中-2)_第113张图片

#设置最大最小日期时间
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))

20.5 是否弹出日历选择控件

PyQt5的笔记(中-2)_第114张图片

#日历选择控件
self.dte.setCalendarPopup(True)

运行效果:

PyQt5的笔记(中-2)_第115张图片 

20.6 获取日期时间

PyQt5的笔记(中-2)_第116张图片

#获取日期时间
print('当前日期时间:',self.dte.dateTime())
print('当前日期:', self.dte.date())
print('当前时间:', self.dte.time())

运行效果:

20.7 信号

PyQt5的笔记(中-2)_第117张图片 

#信号
self.dte.dateTimeChanged.connect(lambda val:print('改变后的日期时间为:',val))
self.dte.dateChanged.connect(lambda val:print('改变后的日期为:',val))

21.QDateEdit和QTimeEdit

均继承于QDateTimeEdit,所以不再详细演练了。

PyQt5的笔记(中-2)_第118张图片

PyQt5的笔记(中-2)_第119张图片

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_())

运行效果:

PyQt5的笔记(中-2)_第120张图片

PyQt5的笔记(中-2)_第121张图片

 

你可能感兴趣的:(Qt知识点,PyQt5,Python,GUI)