• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LOFLY
终其一生,编织快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

10 PyQt5步长调节器

10 PyQt5步长调节器

     PyQt5步长调节器属于一种组合控件,严格的来说也属于输入控件的一部分,主要包含整型步长调节器(QSpinBox)、浮点型步长调节器(QDoubleSpinBox)、时间调节器(QDateTimeEdit)、下拉框(QComboBox)、字体选择框(QFontComboBox)、刻度控件(QSlider)、滚动条控件(QScrollBar)、旋转按钮控件(QDial)、橡皮筋控件(QRubberBand)等。

1 QAbstractSpinBox步长调节器基类

QAbstractSpinBox是我们接下来要学的步长调节器的基类,这个也是一个抽象类,不能直接实例化,在使用QAbstractSpinBox之前先要子类化,或者直接使用子类来创建对象。QAbstractSpinBox中有很多常用的方法,我们遵循一贯的学习顺序,先从它开始。

# 三种步长调节器:整形、浮点型、时间
# QSpinBox
# QDoubleSpinBox
# QDateTimeEdit
self.asb = QAbstractSpinBox(self)
self.asb.resize(100,30)
self.asb.move(100,50)

image

QAbstractSpinBox是一个抽象类,需要子类化它,才能实现它的功能。步长调节器是一个组合控件。

子类化QAbstractSpinBox,实现0-9之间调节。
class Sub_Abs(QAbstractSpinBox):

    def __init__(self,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.lineEdit().setText('0')  # 设置一个默认值,作为容错

    def stepEnabled(self):
        # 取出内部值
        num = int(self.text())
        if num == 0:
            print("只能向上调节")
            return QAbstractSpinBox.StepUpEnabled  # 表示只能向上调节
        elif num == 9:
            print("只能向下调节")
            return QAbstractSpinBox.StepDownEnabled  # 表示只能向下调节
        elif 0 < num < 9:
            print("0-9之间")
            return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
        else:
            return  QAbstractSpinBox.StepNone


    # 设置步长
    def stepBy(self, steps):
        num = int(self.text()) + steps*2
        self.lineEdit().setText(str(num))

长按累加加速功能
self.asb.setAccelerated(True)

只读设置
self.asb.setReadOnly(True)

设置上下键样式

# 设置上下键样式
# QAbstractSpinBox.NoButtons
# QAbstractSpinBox.UpDownArrows 键盘上下键控制
# QAbstractSpinBox.PlusMinus
self.asb.setButtonSymbols(QAbstractSpinBox.UpDownArrows)

self.asb.setButtonSymbols(QAbstractSpinBox.UpDownArrows)

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

class Sub_Abs(QAbstractSpinBox):

    def __init__(self,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.lineEdit().setText('0')  # 设置一个默认值,作为容错

    def stepEnabled(self):

        # 取出内部值
        num = int(self.text())
        if num == 0:
            print("只能向上调节")
            return QAbstractSpinBox.StepUpEnabled  # 表示只能向上调节
        elif num == 9:
            print("只能向下调节")
            return QAbstractSpinBox.StepDownEnabled  # 表示只能向下调节
        elif 0 < num < 9:
            print("0-9之间")
            return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
        else:

            return  QAbstractSpinBox.StepNone
        pass


    # 设置步长
    def stepBy(self, steps):

        num = int(self.text())

        if  num  + steps*2 > 9 :
            pass
        else:
            self.lineEdit().setText(str(num + steps*2))

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QAbstractSpinBox步长调节器抽象基类")
        self.resize(600, 500)
        self.func_list()

    def func_list(self):
        self.func()

    def func(self):
        # 三种步长调节器:整形、浮点型、时间
        # QSpinBox
        # QDoubleSpinBox
        # QDateTimeEdit

        self.asb = Sub_Abs(self)
        self.asb.resize(100,30)
        self.asb.move(100,50)


        # 长按累加加速功能
        self.asb.setAccelerated(True)

        # 只读设置
        # self.asb.setReadOnly(True)

        # 设置和获取文本框内容
        self.btn = QPushButton(self)
        self.btn.move(200,100)
        self.btn.setText("按   钮")
        self.btn.pressed.connect(self.pre_btn)


    def pre_btn(self):
        print(self.asb.text())
        # self.asb.lineEdit().setText("555")

        # 设置对齐方式
        self.asb.setAlignment(Qt.AlignRight) # 设置右对齐

        # 设置周边框架
        self.asb.setFrame(True)

        #清空文本框内推
        # self.asb.clear()

        # 设置上下键模式
        # QAbstractSpinBox.NoButtons
        # QAbstractSpinBox.UpDownArrows
        # QAbstractSpinBox.PlusMinus
        self.asb.setButtonSymbols(QAbstractSpinBox.PlusMinus)

        # 可用信号
        self.asb.editingFinished.connect(lambda  : print(123))

        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()

    window.show()
    sys.exit(app.exec_())

2 QSpinBox整型步长调节器

QSpinBox整型步长调节器顾名思义就是用来调节整型数据的,本节课主要讲解QSpinBox的一些常用的API方法,主要有步长范围,数字循环、前缀后缀、设置和获取值的方法等。

QspinBox 默认范围是0-99。

修改默认范围:

self.qsb.setMaximum(199)
self.qsb.setMinimum(-15)
self.qsb.setRange(-15, 199)

设置数值循环:
self.qsb.setWrapping(True)

# 设置步长
self.qsb.setSingleStep(5)
设置前缀和后缀

self.qsb.setPrefix('元')
self.qsb.setSuffix('月')

代码以及注释:

from PyQt5.Qt import *
import sys


class Qsb(QSpinBox):
    def textFromValue(self, val):
        return (str(val) + '*' + str(val))


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QSpinBox-处理整形数据的步长调节器 - PyQt5中文网")
        self.resize(600, 500)
        self.func_list()

    def func_list(self):
        self.func()

    def func(self):
        self.qsb = Qsb(self)  # 直接构造范围是0-99
        self.qsb.resize(100, 30)
        self.qsb.move(150, 150)

        self.btn = QPushButton('按钮', self)
        self.btn.resize(60, 30)
        self.btn.move(150, 200)
        self.btn.pressed.connect(self.test)

    def test(self):
        '''
        # 修改最大值
        self.qsb.setMaximum(199)
        self.qsb.setMinimum(-15)
        print(self.qsb.minimum())
        self.qsb.setRange(-15,199)
        # 数值循环
        self.qsb.setWrapping(True)
        # 设置步长
        self.qsb.setSingleStep(5)
        # 设置前缀和后缀
        # self.qsb.setPrefix('元')
        # self.qsb.setSuffix('月')
        self.qsb.setRange(0,6)
        self.qsb.setPrefix('周')
        self.qsb.setSpecialValueText('周日')  # 设置最小值字符串
        # 显示数值进制
        self.qsb.setDisplayIntegerBase(2)  # 设置成二进制
        # 获取或设置文本框数值
        # self.qsb.setRange(1,25)  # 这里设置之后下面数值设置超过范围内则显示这里的最大值
        self.qsb.setValue(50)
        print(self.qsb.value())  # 只能拿到数值
        print(self.qsb.text())  # 能拿到数值和前缀
        print(self.qsb.lineEdit().text())  # 能拿到数值和前缀
        '''
        # 自定义展示格式,重写方法,在上面Qsb中

        # 可用信号
        self.qsb.valueChanged[int].connect(lambda val: print(type(val)))
        self.qsb.valueChanged[str].connect(lambda val: print(type(val)))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()

    window.show()
    sys.exit(app.exec_())

3 QDoubleSpinBox浮点型步长调节器

from PyQt5.Qt import *
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QDoubleSpinBox-处理浮点型步长调节器 - PyQt5中文网")
        self.resize(600, 500)
        self.func_list()

    def func_list(self):
        self.func()

    def func(self):
        self.qsb = QDoubleSpinBox(self)  # 直接构造范围是0-99.99,步长为1.0
        self.qsb.resize(100, 30)
        self.qsb.move(150, 150)

        self.btn = QPushButton('按钮', self)
        self.btn.resize(60, 30)
        self.btn.move(150, 200)
        self.btn.pressed.connect(self.test)

    def test(self):
        # 修改最大值
        self.qsb.setMaximum(9.99)
        self.qsb.setMinimum(-5.2)
        print(self.qsb.minimum())
        self.qsb.setRange(-5.2, 9.99)
        # 数值循环
        self.qsb.setWrapping(True)
        # 设置步长
        self.qsb.setSingleStep(0.07)

        # 设置前缀和后缀
        self.qsb.setPrefix('%')
        self.qsb.setSuffix('$')
        # self.qsb.setRange(0.5,5.5)
        # self.qsb.setPrefix('周')
        # self.qsb.setSpecialValueText('周日')  # 设置最小值字符串
        # 小数位数设置
        self.qsb.setDecimals(1)

        # 获取或设置文本框数值
        # self.qsb.setRange(1,25)  # 这里设置之后下面数值设置超过范围内则显示这里的最大值
        self.qsb.setValue(50)
        print(self.qsb.value())  # 只能拿到数值
        print(self.qsb.cleanText())  # 获取文本字符串,不包括前后缀和空格
        print(self.qsb.text())  # 能拿到数值和前缀
        print(self.qsb.lineEdit().text())  # 能拿到数值和前缀

        # 自定义展示格式,重写方法,在上面Qsb中

        # 可用信号
        self.qsb.valueChanged[float].connect(lambda val: print(type(val)))
        self.qsb.valueChanged[str].connect(lambda val: print(type(val)))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()

    window.show()
    sys.exit(app.exec_())

4 QDateTimeEdit时间日期调节器

QDateTimeEdit时间日期调节器和之前学过的两种调节器有很多不一样的地方,但是也有很多共同点,在使用的时候主要是看你使用哪种构造方法,然后给予对应的设置。在后面对话框中我们还需要学习另一种时间日期对话框,和QDateTimeEdit的用途相似,但是有本质的区别,这里就不多说了。

image

使用QDateTime来获取当前时间:

# 修改时间的展示样式
self.qsb.setDisplayFormat('yyyy-MM-dd* hh:mm:ss')

设置日期的显示范围:

# 设置日期范围
# self.qsb.setMaximumDateTime(QDateTime(2022,3,23,0,6))
# self.qsb.setMinimumDateTime(QDateTime(1900,3,23,0,6))
# 设置范围为前3天和后3天
self.qsb.setDateTimeRange(QDateTime().currentDateTime().addDays(-3),QDateTime().currentDateTime().addDays(3))
# 日历选择  打开日历
self.qsb.setCalendarPopup(True)

image

# 获取时间和日期
print(self.qsb.dateTime())
print(self.qsb.date())
print(self.qsb.time())
# 可用信号
self.qsb.dateTimeChanged.connect(lambda: print(self.qsb.dateTime())) # 日期时间发生改变
self.qsb.timeChanged.connect(lambda: print(self.qsb.time())) # 时间发生改变
self.qsb.dateChanged.connect(lambda: print(self.qsb.date())) #日期发生改变

5 QComboBox下拉框控件

QComboBox下拉框控件也属于另一种样式的组合控件,虽然和之前学习的步长调节器有很多不同之处,但是也属于步长调节器的一种,这节课主要讲一下QComboBox下拉框控件属性、API和条目设置等功能,其中条目设置比较重要。

image

  1. 添加条目
    image

image

# 1. 增加条目
# self.qcb.addItem("pyqt5的网站")
# self.qcb.addItem(QIcon("fy.png"),"Pyq5教程") # 图片和文本

self.qcb.addItems(("java","python","C++"))
2.	插入条目
self.qcb.insertItem(2,"JS") # 在指定位置插入条目
self.qcb.insertItem(2,"JS") # 在指定位置插入条目
self.qcb.insertItem(2, QIcon("fy.png"),"JS")
self.qcb.insertItems(2,("java","python","C++"))

# 3。 设置(修改)条目
self.qcb.setItemText(2,"China")  # 修改文本内容
self.qcb.setItemIcon(2,QIcon("male.png")) # 修改图片
4.	删除条目
qcb.insertSeparator(2) # 在位置2处插入分割线

image

  1. 默认值设定
    下拉菜单默认显示第一个。
self.qcb.setCurrentIndex(1)
# self.qcb.setCurrentText("java") # 设置为下拉列表中的值
self.qcb.setCurrentIndex(1)
# self.qcb.setCurrentText("java") # 设置为下拉列表中的值
self.qcb.setEditable(True) # 设置文本可编辑
self.qcb.setEditText("WWWWW") # 设置文本
  1. 数据获取
self.qcb.addItem(QIcon("fy.png"),"Pyq5教程",{"name":"张三"}) # 图片和文本

print(self.qcb.count()) # 获取下拉框的条目数
print(self.qcb.itemIcon(2)) # 获取第二个位置的图片
print(self.qcb.itemText(3)) # 获取第3个位置的文本

print(self.qcb.currentText()) # 获取当前条目的文本
print(self.qcb.currentIndex()) # 获取当前条目的索引

print(self.qcb.itemData(0)) # 获取指定条目的数据  返回{"name":"张三"}
print(self.qcb.currentData()) # 获取当前条目的数据
  1. 下拉框条目数限制
self.qcb.setMaxCount(3) # 设置最大存储条目的个数
self.qcb.setMaxVisibleItems(2) # 设置最大可见的条目个数
  1. 可重复
    self.qcb.setDuplicatesEnabled(True)

  2. 有边框
    self.qcb.setFrame(False)

  3. 图标尺寸
    self.qcb.setIconSize(QSize(30,30))

  4. 尺寸调整策略
    self.qcb.setSizeAdjustPolicy(QComboBox.AdjustToContentsOnFirstShow)

AdjustToContents = 0
AdjustToContentsOnFirstShow = 1

AdjustToMinimumContentsLength = 2
AdjustToMinimumContentsLengthWithIcon = 3

  1. 清空
    self.qcb.clear()
    self.qcb.clearEditText() # 清空被编辑的内容

  2. 弹出下拉框
    self.qcb.showPopup()

  3. 下拉匹配
    self.qcb.setCompleter(QCompleter(("java","python","C++")))

self.qcb.setCompleter(QCompleter(("java","python","C++")))
16. 可用信号
image

from PyQt5.Qt import *
import sys

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.resize(600,500)
        self.move(300,300)
        self.funclist()

    def funclist(self):
        self.func()

    def func(self):

        self.qcb = QComboBox(self)
        self.qcb.move(150,150)
        self.qcb.resize(150,40)

        self.btn = QPushButton("按钮",self)
        self.btn.resize(60,30)
        self.btn.move(150,250)
        self.btn.pressed.connect(self.test)



    def test(self):
        # 1. 增加条目
        # self.qcb.addItem("pyqt5的网站")
        self.qcb.addItem(QIcon("fy.png"),"Pyq5教程",{"name":"张三"}) # 图片和文本

        self.qcb.addItems(("java","python","C++"))

        #2. 插入条目
        self.qcb.insertItem(2,"JS") # 在指定位置插入条目
        self.qcb.insertItem(2, QIcon("fy.png"),"JS")
        self.qcb.insertItems(2,("java","python","C++"))

        # 3。 设置(修改)条目
        self.qcb.setItemText(2,"China")  # 修改文本内容
        self.qcb.setItemIcon(2,QIcon("male.png")) # 修改图片

        # 4。删除条目
        # self.qcb.removeItem(0)

        # 5. 插入分割线
        # self.qcb.insertSeparator(1)

        # 6.设置默认值
        # self.qcb.setCurrentIndex(1)
        # # self.qcb.setCurrentText("java") # 设置为下拉列表中的值
        self.qcb.setEditable(True) # 设置文本可编辑
        # self.qcb.setEditText("WWWWW") # 设置文本

        # 7.数据获取
        print(self.qcb.count()) # 获取下拉框的条目数
        print(self.qcb.itemIcon(2)) # 获取第二个位置的图片
        print(self.qcb.itemText(3)) # 获取第3个位置的文本

        print(self.qcb.currentText()) # 获取当前条目的文本
        print(self.qcb.currentIndex()) # 获取当前条目的索引

        print(self.qcb.itemData(0)) # 获取指定条目的数据
        print(self.qcb.currentData()) # 获取当前条目的数据

        # 8. 下拉框条目数限制
        # self.qcb.setMaxCount(3) #设置最大存储条目的个数
        # self.qcb.setMaxVisibleItems(2) # 设置最大可见的条目个数

        # 9 .可重复
        self.qcb.setDuplicatesEnabled(True)
        self.qcb.setDuplicatesEnabled(False)

        # 10.有边框
        self.qcb.setFrame(False)

        # 11.图标尺寸
        self.qcb.setIconSize(QSize(30,30))

        # 12.尺寸调整策略
        self.qcb.setSizeAdjustPolicy(QComboBox.AdjustToContentsOnFirstShow)

        # 13 清空
        # self.qcb.clear()
        self.qcb.clearEditText() # 清空被编辑的内容

        # 14 弹出下拉框
        self.qcb.showPopup()

        # 15 下拉匹配
        self.qcb.setCompleter(QCompleter(("java","python","C++")))
        pass


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("QComboBox下拉框案例 - PyQt5中文网")
        self.resize(600, 500)
        self.city_dic = {
            '江苏省': {
                '南京': '025',
                '徐州市': '0516',
                '淮安市': '0517',
                '盐城市': '0515',
                '扬州市': '0514',
                '苏州市': '0512',
            },
            '浙江省': {
                '杭州市': '0571',
                '宁波市': '0574',
                '金华市': '0579',
                '舟山市': '0580',
                '温州市': '0577',
                '台州市': '0576',
            },
            '安徽省': {
                '合肥市': '0551',
                '滁州市': '0550',
                '宿州市': '0557',
                '巢湖市': '0565',
                '黄山市': '0559',
                '宣州市': '0563',
            },
            '河北省': {
                '石家庄市': '0311',
                '邯郸市': '0310',
                '保定市': '0312',
                '唐山市': '0315',
                '沧州市': '0317 ',
                '衡水市': '0318',
                '邢台市': '0319',
            },
        }
        self.func_list()

    def func_list(self):
        self.func()

    def func(self):
        self.qcb1 = QComboBox(self)
        self.qcb1.move(100, 150)
        self.qcb1.resize(100, 40)

        self.qcb2 = QComboBox(self)
        self.qcb2.move(240, 150)
        self.qcb2.resize(100, 40)

        # 1.获取省一级,这里要先链接信号,然后添加数据,数据从无到有也能触发信号
        # self.qcb1.addItems(self.city_dic.keys())
        self.qcb1.currentIndexChanged[str].connect(self.qcb1_changed)
        self.qcb1.addItems(self.city_dic.keys())

        # 2.获得当前选中省的名称
        self.qcb1_changed(self.qcb1.currentText())

        # 4.城市区号获取方法
        self.qcb2.currentIndexChanged[int].connect(self.qcb2_changed)
        self.qcb2_changed(self.qcb2.currentIndex())

    def qcb1_changed(self, name):
        # print(name)
        # 3.根据省的名称到字典中查找下级城市名称
        citys = self.city_dic[name]
        # print(citys)
        # 从字典中获取下级城市名称到下一个下拉框中
        '''
        # self.qcb2.addItems(citys.keys())  # 这只会追加城市,所以要清空之前的数据,在重新添加条目
        self.qcb2.clear()
        # self.qcb2.addItems(citys.keys())
        '''
        self.qcb2.blockSignals(True)
        self.qcb2.clear()  # 这里会出现None结果,参考97行代码
        self.qcb2.blockSignals(False)

        for key, val in citys.items():  # 通过增加val数据来获取
            self.qcb2.addItem(key, val)
            # print(citys.items())

    def qcb2_changed(self, num):  # 这里传入条目的索引值
        # print(num) # 这里值为-1,会打印None
        print(self.qcb2.itemData(num))
        # 这里注意itemData()的用法


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()

    window.show()
    sys.exit(app.exec_())
posted @ 2022-08-31 20:32  编织快乐  阅读(191)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3