PyQt5 基本语法(五)
阅读原文时间:2022年04月06日阅读:1

目录

2、 输入控件(二)

简介:

  • 步长调节,QAbstractSpinBox,键盘加鼠标都可以操作

2.2.1 QAbstractSpinBox

2.2.1.1 描述

其是一个由步长调节器和单行文本框来调节和显示数据

继承自 QWidget

其实例化后无法通过鼠标来调节步长,只有通过方法重写来实现

2.2.1.2 功能作用

2.2.1.2.1 使用
  1. 子类化此对象

  2. 实现控制上下能用的方法

    # 重写方法
    stepEnabled()

    QAbstractSpinBox.StepEnabled:

    • QAbstractSpinBox.StepNone:都不能使用
    • QAbstractSpinBox.StepUpEnabled:只有向上可用
    • QAbstractSpinBox.StepDownEnabled:只有向下可用
  3. 实现步长调整方法

    stepBy(p_int)
  4. 示例

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    # @author: kun
    from PyQt5.Qt import *
    import sys
    
    class MyQAbstractSpinBox(QAbstractSpinBox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.lineEdit().setText("0")  # 设置默认值为0
    
    def stepEnabled(self):
        # 比如限定数据只能0~9,当数据等于0是,只能向上调节,当数据等于9时,数据只能向下调节
        if int(self.text()) == 0:
            return QAbstractSpinBox.StepUpEnabled
        if int(self.text()) == 9:
            return QAbstractSpinBox.StepDownEnabled
        if 0 <= int(self.text()) <= 9:
            return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled
    
        return QAbstractSpinBox.StepNone
    
    def stepBy(self, p_int):
        # p_int 为 1 向上 或 -1 向下
        print(p_int)
        self.lineEdit().setText(str(int(self.text()) + p_int))  # 通过拿到左边的单行文本编辑器来编辑文本内容,设置每次点击一次增加1
    app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) qa = MyQAbstractSpinBox(w) # 创建对象 qa.resize(100, 30) qa.move(100, 100) w.show() sys.exit(app.exec_())
2.2.1.2.2 主要功能
  1. 长按调整步长加快频率

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    # @author: kun
    from PyQt5.Qt import *
    import sys
    
    class MyQAbstractSpinBox(QAbstractSpinBox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.lineEdit().setText("0")  
    
    def stepEnabled(self):
        return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled
    
    def stepBy(self, p_int):
        self.lineEdit().setText(str(int(self.text()) + p_int))  
    app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) qa = MyQAbstractSpinBox(w) qa.setAccelerated(True) # 开启长按加速的功能 print(qa.isAccelerated()) # 判断是否开启加速功能 qa.resize(100, 30) qa.move(100, 100) w.show() sys.exit(app.exec_())

    控制用户长按按钮后,内容调整的频率

  2. 只读限制

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    # @author: kun
    from PyQt5.Qt import *
    import sys
    
    class MyQAbstractSpinBox(QAbstractSpinBox):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.lineEdit().setText("0")
    
    def stepEnabled(self):
        return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled
    
    def stepBy(self, p_int):
        self.lineEdit().setText(str(int(self.text()) + p_int))
    app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) qa = MyQAbstractSpinBox(w) qa.setReadOnly(True) # 设置只读限制,只能通过按钮修改值,不能通过键盘键入数值 print(qa.isReadOnly()) # 判断是否开启只读限制 qa.resize(100, 30) qa.move(100, 100) w.show() sys.exit(app.exec_())
  3. 设置及获取内容

    text()  # 获取文本框,里面的内容
    lineEdit()  # 拿到左边单行文本框对象,可以对内容进行设置和获取
    # 设置文本框内容
    lineEdit().setText(str)
    # 获取文本框内容
    lineEdit().text()

    QLineEdit:里面的大部分方法都可以在这里使用

  4. 设置对齐方式

    qa.setAlignment(Qt.Alignment)  # 设置文本的对齐方式
    qa.alignment()  # 获取文本的对齐方式
  5. 设置周边框架

    qa.setFrame(False)  # 设置周边框架,默认有边框
    print(qa.hasFrame())  # 查看是否有框架
    qa.clear()  # 清空文本框内的文本内容
  6. 设置按钮样式

    setButtonSymbols(QAbstractSpinBox.ButtonSymbols)  # 设置按钮样式
    buttonSymbols()  # 获得按钮样式
2.2.1.2.3 内容验证
2.2.1.2.3.1 语法

其在输入内容时进行验证

  • validate(p_str, p_int):验证规则
  • fixup(p_str):恢复方法

具体内容:点我

2.2.1.2.3.2 案例

验证通过 18 ~ 180 的数据,超过部分设置为最近的最值

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

class MyQAbstractSpinBox(QAbstractSpinBox):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.lineEdit().setText("18")

    def stepEnabled(self):
        if int(self.text()) == 18:
            return QAbstractSpinBox.StepUpEnabled
        if int(self.text()) == 180:
            return QAbstractSpinBox.StepDownEnabled
        if 18 < int(self.text()) < 180:
            return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled

    def stepBy(self, p_int):
        self.lineEdit().setText(str(int(self.text()) + p_int))

    def validate(self, input_text, pos):
        # 判断 18 ~ 180 的数字
        if input_text == "":
            return QValidator.Intermediate, input_text, pos  # 暂时不报错

        if not input_text.isdigit():
            return QValidator.Invalid, input_text, pos

        if int(input_text) < 18:
            return QValidator.Intermediate, input_text, pos  # 暂时不报错

        if input_text.isdigit() and 18 <= int(input_text) <= 180:
            return QValidator.Acceptable, input_text, pos  # 验证通过

        return QValidator.Invalid, input_text, pos  # 直接报错

    def fixup(self, input_text):
        return "18"  # 如果值处于暂时不报错的区间,自动将值修改为18,注意要将文本内容改为字符串类型

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
qa = MyQAbstractSpinBox(w)
qa.resize(100, 30)
qa.move(100, 100)
btn = QPushButton(w)
w.show()
sys.exit(app.exec_())

2.2.1.3 信号

有继承父类的信号

新的信号:

editingFinished()  # 结束编辑时调用

2.2.2 QSpinBox

2.2.2.1 描述

主要处理整数和离散值集,如 1 ~ 12 ,1 ~ 7,其会默认限制数字范围 0 ~ 99

允许用户通过单击 向上/向下 按钮或者键盘上的 上/下 来选择一个值 增加/减少 当前显示的值,用户还可以手动键入值

旋转框支持整数值,也可以子类化此类以实现更多支持

继承自QAbstractSpinBox

2.2.2.2 功能作用

2.2.2.2.1 构造函数
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)

sp = QSpinBox(w)  # 创建控件
sp.resize(100, 30)
sp.move(100, 100)

sp.setMaximum(13)  # 设置文本框内部的最大数字为 13
sp.setMinimum(0)  # 设置文本框内部的最小数字为 0
sp.setRange(0, 13)  # 设置值区间  

w.show()
sys.exit(app.exec_())
2.2.2.2.2 基本功能
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

class MySpinBox(QSpinBox):
    def textFromValue(self, v):
        # 自定义显示格式
        print(v)
        return str(v) + "+" + str(v + 1)

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)

sp = MySpinBox(w)
sp.resize(100, 30)
sp.move(100, 100)

sp.setRange(0, 12)

# sp.setWrapping(True)  # 开启数值循环
# print(sp.wrapping())  # 查看是否开启数值循环
# sp.setSingleStep(3)  # 设置单次点击的步长为3
# print(sp.singleStep())  # 获取步长

# sp.setPrefix("第")  # 设置前缀
# sp.setSuffix("月")  # 设置后缀
# sp.setSpecialValueText("一月")  # 设置显示特殊数据,当数据达到最小值时,会显示此字符串

# sp.setDisplayIntegerBase(2)  # 设置显示基数(进制),默认是10进制。这里是二进制展示数据
# print(sp.displayIntegerBase())  # 输出以几进制显示数据

# sp.setValue(12)  # 设置数值
# print(sp.value())  # 获取数值

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

2.2.2.3 信号

父类的信号也都可以使用

valueChanged(int / str)  # 当数字改变时,发送的信号 ,返回字符串或整型,其为函数重载

2.2.4 QDoubleSpinBox

2.2.4.1 描述

浮点类型步长调节器

既可以通过步长调节器调整数据,也可以通过文本框直接编辑

继承自 QAbstractSpinBox

2.2.4.2 功能作用

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

class MyDoubleSpinBox(QDoubleSpinBox):
    def textFromValue(self, v):
        print(v)
        return f"{v} * {v} = {v * v}"  # 自定义数据格式

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)

ds = MyDoubleSpinBox(w)  # 创建对象,默认步长为 1 ,默认范围为 0 ~ 99
ds.setRange(1.0, 20.0)  # 设置数值范围,这里最大值为 20.0 最小值为 1.0,注意传入的参数是一个浮点型数据,另外的两种设置最值的方法也适用

# ds.setSingleStep(0.02)  # 设置单次步长
# ds.setWrapping(True)  # 设置循环
# ds.setAccelerated(True)  # 设置是否长按加速改变
#
# ds.setPrefix("前缀")  # 设置前缀
# ds.setSuffix("后缀")  # 设置后缀
#
# ds.setSpecialValueText("这是特殊文本")  # 设置最小值时的特殊文本
#
# ds.setDecimals(2)  # 设置要保留的小数位数,这里保留两位小数位数
#
# ds.setValue(16.0)  # 设置数据,如果小数位数过多,则四舍五入来显示数据
# ds.value()  # 获取真实数值
# ds.cleanText()  # 获取内显示的数值,不包括前缀等,返回字符串类型

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

2.2.4.3 信号

valueChanged(float / str)  # 当文本框内的数值改变时,发送信号,其为函数重载

2.2.5 QDateTimeEdit

2.2.5.1 描述

编辑日期和时间的单行文本框

既可以使用箭头来调节,也可以使用键盘编辑输入

可以单独调节每一部分

其继承自 QAbstractSpinBox

2.2.5.2 功能作用

2.2.5.2.1 构造函数
QDateTimeEdit(parent: QWidget = None)
QDateTimeEdit(Union[QDateTime, datetime.datetime], parent: QWidget = None)
QDateTimeEdit(Union[QDate, datetime.date], parent: QWidget = None)
QDateTimeEdit(Union[QTime, datetime.time], parent: QWidget = None)

QDateTime

  • 时间日期对象,它是QDate和QTime类的组合

    QDateTime(Union[QDate, datetime.date], Union[QTime, datetime.time], QTimeZone)  # 构造

QDate

  • 日期对象,包括年月日

    QDate(int, int, int)  # 构造

QTime

  • 时间对象,包括时分秒

    QTime(int, int, second: int = 0, msec: int = 0)  # 构造
2.2.5.2.2 主要功能

显示格式

setDisplayFormat(format_str)  # 参数是,时间日期分隔符,再加上时间日期格式符
displayFormat()  # 获取时间日期打印格式

section 控制

sectionCount()  # 获取section个数
setCourrentSectionIndex(int)  # 设置当前的section索引
currentSectionIndex()  # 获取section索引
setCurrentSection(QDateTimeEdit.Section)  # 设置当前的section部分
currentSection()  # 获取当前的section部分
sectionAt(index_int)  # 获取指定索引位置的section
sectionText(QDateTimeEdit.Section)  # 获取指定section的文本内容

日期时间最值

# 最大日期时间
setMaximumDateTime(QDateTime)
maximumDateTime()  # 获取最大的日期时间
clearMaximumDateTime()

# 最小日期时间
setMinimumDateTime(QDateTime)
minimumDateTime()  # 获取最小的日期时间
clearMinimumDateTime()

# 范围
setDateTimeRange(min_datetime, max_datetime)

日期和时间单独的最值设置方法类似

获取日期时间

dateTime()  # 获取日期时间 QDateTime
date()  # 获取日期 QDate
time()  # 获取时间 QTime
2.2.5.2.3 日历选择控件

是否弹出日历选择控件

setCalendarPopup(bool)
calendarPopup()  # 判断是否弹出日历选择控件

自定义日历选择控件

setCalendarWidget(QCalendarWidget)
calendarWidget()  # 获取自定义日历控件

2.2.5.3 信号

dateTimeChanged(QDateTime)
dateChanged(QDate)
timeChanged(QTime)

2.2.5.4 拓展

QDateEditQTimeEdit

  • 继承QDateTimeEdit,父类的方法,子类都可以使用

信号也是继承父类的信号

2.3.1 QComboBox

2.3.1.1 描述

其是一个组合控件,默认展示最小的空间给用户操作,可以通过下拉选择界面,选取更多的预置选项

其继承自,QWidget

2.3.1.2 功能作用

2.3.1.2.1 构造函数
qc = QComboBox(w)  # 直接添加父控件就行了
2.3.1.2.2 数据操作
# 添加条目项
addItem([QIcon, ]str, userData=None)
addItems(Iterable[str], userData=None)

# 插入条目项
insertItem(int, [QIcon, ]str, userData=None)
insertItems(int, Iterable[str], userData=None)

# 设置条目项
setItemIcon(int, Icon)
setItemText(int, str)
setItemData(int, data, Qt.UserRole)

# 删除条目项
removeItem(int)  

# 插分割线
insertSeparator(int)

# 设置当前编辑文本
setCurrentIndex(int)
setCurrentText(QString)  # 设置光标在指定文本

setEditable(bool)  # 使当前的文本可编辑
setEditText(QString)  # 只有文本可编辑才可以使用此方法
2.3.1.2.3 数据获取
count()  # 获取所有条目的总个数
itemIcon(int)  # 获取对应索引位置的图标
itemText(int)  # 获取对应索引位置的文本信息
itemData(int)  # 获取对应索引位置的数据
currentIndex()  # 获取当前位置的索引
currentTextr()  # 获取当前位置的文本信息
2.3.1.2.4 数据限制
setMaxCount(int)  # 在可编辑之后,设置可存储的最大条目
maxCount()  # 查看可存储的最大条目
setMaxVisibleItems(int)  # 在可编辑之后,设置可展示的最大条目个数,其余被折叠
maxVisibleItems()
2.3.1.2.5 常规操作
# 可编辑
setEditable(bool)
isEditable()

# 可重复
setDuplicatesEnabled(bool)
duplicatesEnable()

# 有框架
setFrame(bool)
hasFrame()

# 图标尺寸
setIconSize(QSize)
iconSize()

# 清空
clear()  # 移除所有条目
clearEditText()  # 清除组合框内用于编辑的行编辑内容

# 弹出,下拉列表
showPopup()

# 完成器
setCompleter(QCompleter)

# 验证器
setValidator(QValidator)

尺寸调整策略

setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy)  # 参数是尺寸调整策略,请在源码查看
sizeAdjustPolicy()  # 获取尺寸调整策略
setMinimumContentsLength(int)  # 设置内容的最小尺寸
minimumContentsLength()  # 获取内容的最小尺寸

2.3.1.3 信号

activated(int | QString)  # 某个条目选中时,返回索引,或返回选中框的内容
currentIndexChanged(int | QString)  # 当前选中的索引发生改变时
currentTextChanged(QString)  # 当前的文本发生改变时
editTextChanged(QString)  # 编辑的文本内容发生改变时
highlighted(int | QString)  # 高亮时

2.3.2 QFontComboBox

2.3.2.1 描述

组合框中填充了按字母排序排列的字体系列名称列表,让用户选择字体家族

其继承自QComboBox

2.3.2.2 功能作用

# 设置和获取当前字体
setCurrentFont(QFont)
currentFont()

# 设置和获取过滤器
setFontFilters(QFontComboBox.FontFilters)  # 过滤器请通过源码来查找
fontFilters()

2.3.2.3 信号

currentFontChanged(QFont)
currentIndexChanged(QString)  # 继承信号

2.4.1 AbstractSlider

2.4.1.1 描述

提供的范围内的整数值,其为抽象类

继承自 QWidget

2.4.1.2 功能作用

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
l = QLabel(w)
l.move(200, 200)

qs = QSlider(w)  # 实例化
qs.valueChanged.connect(lambda val: l.setText(str(val)))  # 信号检测

# qs.setMaximum(100)  # 设置滑动的最大值
# qs.setMinimum(10)  # 设置滑动的最小值
# qs.setTracking(True)  # 设置是否追踪
# qs.setSingleStep(2)  # 设置每次移动的步长
# qs.setPageStep(4)  # 设置上下键移动的步长
# qs.setValue(11)  # 设置当前默认的数值
# qs.setSliderPosition(13)  # 设置滑块位置
# qs.setInvertedAppearance(True)  # 倒立外观
# qs.setInvertedControls(True)  # 键盘的上下键操作方向相反
# qs.setOrientation(Qt.Horizontal)  # 水平放置,默认为垂直
# qs.setSliderDown(True)  # 滑块处于被按下的状态

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

2.4.1.3 信号

valueChanged()
sliderPressed()
sliderMoved(int)  # 返回滑块对应位置的值
sliderReleased()
actionTriggered(int action)  # 返回滑块的移动方式
rangeChanged(int min, int max)

2.4.2 QSlider

2.4.2.1 描述

其为垂直或者水平滑块;它允许用户沿水平或者垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值

继承自 QAbstractSlider

2.4.2.2 功能作用

# 刻度控制
setTickPosition(Qt.Qslider.TickPosition)  # 类型可以从源码中查找

setTickInterval(int)  # 设置值的间隔,而不是像素间隔。如果为0,滑块将在singleStep 和 pageStep 之间进行选择

2.4.2.3 信号

继承父类的所有信号

2.4.3 QScrollBar

2.4.3.1 描述

使用户能够访问比用于显示它的窗口小部件更大的文档部分,一般是结合QAbstractScrollArea使用;滚动条通常包含是个单独的空间:滑块、滚动箭头和页面控件

继承自 QAbstractSlider

2.4.3.2 功能作用

控件尺寸需要手动进行调整

主要功能继承自父类

滚动区域 = 总长度 - 滚动条宽度

2.4.3.3 信号

继承自父类

2.4.4 QDial

2.4.4.1 描述

倒圆的范围控制,比如汽车仪表盘上的速度计

继承自QAbstractSlider

2.4.4.2 功能作用

大部分功能继承自父类

特有功能

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
sb = QDial(w)  # 创建对象
sb.valueChanged.connect(lambda val: print("值改变了", val))
sb.setNotchesVisible(True)   # 设置是否显示刻度
sb.setPageStep(10)  # 大刻度的控制
sb.setWrapping(False)  # 设置是否启用刻度包裹
sb.setNotchTarget(5.0)  # 设置凹凸之间的目标像素数,小刻度的度数
print(sb.notchSize())  # 获取缺口的大小

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

2.4.4.3 信号

继承自父类的信号

2.5.1 QRubberBand

2.5.1.1 描述

提供一个矩形或者线来指示选择或边界

一般结合鼠标事件一同协作

继承自 QWidget

2.5.1.2 功能作用

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)

""" QRubberBand(QRubberBand.Shape, parent: QWidget = None) """
rb = QRubberBand(QRubberBand.Rectangle, w)
rb.setGeometry(10, 10, 60, 60)
print(rb.shape())  # 获取形状
print(rb.isVisible())  # 默认为隐藏
rb.show()

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

2.5.1.3 信号

继承自父类的信号

2.5.1.4 选中框案例

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("test")  # 设置标题
        self.resize(500, 500)  # 设置窗口大小
        self.move(100, 100)  # 移动窗口
        self.setup_ui()  # 调用创建控件的方法

    def setup_ui(self):  # 添加控件的操作
        for i in range(30):
            # 九宫格布局
            cb = QCheckBox(self)
            cb.setText(str(i))
            cb.move(i % 4 * 50, i // 4 * 60)
        self.sb = QRubberBand(QRubberBand.Rectangle, self)

    def mousePressEvent(self, evt):
        # 创建一个橡皮筋选中对象,尺寸大小:鼠标点击位置,0 0,展示控件
        self.origin_pos = evt.pos()
        self.sb.setGeometry(QRect(self.origin_pos, QSize()))
        self.sb.show()

    def mouseMoveEvent(self, evt):
        # 调整橡皮筋显示的尺寸
        self.sb.setGeometry(QRect(self.origin_pos, evt.pos()).normalized())  # 加上 normalized 可以使得如果计算的结果为负数,会自动转换

    def mouseReleaseEvent(self, evt):
        # 获取范围,遍历所有子控件,查看哪些子控件在区域范围内
        rect = self.sb.geometry()
        # print(rect)
        for i in self.children():
            if rect.contains(i.geometry()) and i.inherits("QCheckBox"):  # 判断复选框是否被包含
                i.toggle()
        self.sb.hide()  # 完成操作后隐藏

if __name__ == '__main__':
    # 可以通过导包来运行窗口
    import sys

    app = QApplication(sys.argv)
    # 创建窗口
    w = Window()
    # 显示窗口
    w.show()
    sys.exit(app.exec_())

2.6.1 QDialog

2.6.1.1 描述

其实对话窗口的一个基类;对话窗口是顶级窗口,主要用于短期任务和与用户的简短通信

QDialog 可能是模态的或非模态的对话框

  1. 模态对话框

    • 应用程序级别

      • 默认值
      • 当该中模态的对话框出现时,用户必须首先对对话框进行交互,直接关闭,然后才能访问程序其他的窗口
      • exec()
    • 窗口级别

      • 该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其他窗口交互
      • open()
  2. 非模态对话框

    • 不会阻塞与对话框关联的窗口以及其他窗口进行交互
    • show()
      • 结合 setModal(True)也可以实现模态对话框
      • 结合setWindowMondality(Qt.WindowModal)也可以实现模态对话框
        • Qt.WindowModal
        • Qt.ApplicationModal

QDialogs 可以提供返回值,它们可以有默认按钮

继承自 QWidget

2.6.1.2 功能作用

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
w = QWidget()

dl = QDialog(w)  # 创建窗口
reject = QPushButton("取消", dl)
accept = QPushButton("确定", dl)
accept.move(0, 50)
done = QPushButton("完成", dl)
done.move(0, 26)
# 是否显示尺寸调整控件
# dl.setSizeGripEnabled(True)
# 常用的操作槽,操作槽其返回值不一样
reject.clicked.connect(lambda: dl.reject())
accept.clicked.connect(lambda: dl.accept())
done.clicked.connect(lambda: dl.done(7))

# 设置和获取结果数值:等于是直接返回结果,不需要通过操作槽
dl.setResult(3)
print(dl.result())

# 模态对话框,exec()  或 open()
ret = dl.exec()
# 非模态对话框
# dl.show()

print(ret)

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

2.6.1.3 信号

accepted()
finished(int result)
rejected()

2.6.2 QFontDialog

2.6.2.1 描述

提供了一种选择字体的对话框控件

继承自 QDialog

2.6.2.2 功能作用

2.6.2.2.1 简单使用
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

def setFont_():
    fd.setCurrentFont(QFont("黑体"))  # 设置当前选中的字体
    """
    def selFont_():
        font = fd.selectedFont()
        print("字体已经被选中", font)  # 获取选中的字体
        l.setFont(font)  # 设置标签字体样式

    fd.open(selFont_)  # 添加槽函数,如果点击确定,就会发射信号,如果点击取消,就不会发射信号
    """
    # 第二种方式
    ret = fd.exec()
    if ret:  # 如果返回值不为0
        l.setFont(fd.selectedFont())
    else:
        return None

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)

l = QLabel("字体测试", w)
l.resize(100, 30)
l.move(100, 0)
btn = QPushButton("修改字体", w)
btn.move(100, 30)

fd = QFontDialog(w)  # 创建对话框

btn.clicked.connect(setFont_)

w.show()
sys.exit(app.exec_())
2.6.2.2.2 选项控制
setOption(QFontDialog.FontDialogOption, on=True)  # on参数表示是否启用该选项,默认为True
setOptions(QFontDialog.FontDialogOption)  # 设置多个选项
testOption(QFontDialog.FontDialogOption)  # 测试某个选项是否生效
options()  # 获取当前的选项

QFontDialog.FontDialogOption:

QFontDialog.NoButtons  # 不显示确定和取消按钮,对实时对话框有用
QFontDialog.DontUseNativeDialog  # 不使用原生的字体对话框
QFontDialog.ScalableFonts  # 显示可缩放的字体
QFontDialog.NonScalableFonts  # 显示不可缩放的字体
QFontDialog.MonospacedFonts  # 显示等宽字体
QFontDialog.ProportionalFont  # 显示比例字体
2.6.2.2.3 静态方法
getFont([QFont, ]parent[, caption, options])  # 其返回一个元组,第二个值为是否点击确定按钮

参数:

  • QFont:默认字体
  • parent:父控件
  • capttion:对话框标题
  • options:选项

2.6.2.3 信号

currentFontChanged(QFont)  # 当前字体发生改变时
fontSelected(QFont)  # 最终选择字体时

2.6.3 QColorDialog

2.6.3.1 描述

颜色对话框的功能是允许用户选择颜色

继承自QDialog

2.6.3.2 功能作用

2.6.3.2.1 基本使用
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys

def getColor_():
    """
    def selColor():
        print(qc.selectedColor())  # 获取选中的颜色
    qc.open(selColor)
    """
    ret = qc.exec()
    if ret:
        color = qc.selectedColor()
        print(color)
        platte = QPalette()  # 利用调色板设置颜色
        platte.setColor(QPalette.Background, color)  # 设置背景颜色
        w.setPalette(platte)

app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)

btn = QPushButton("获取颜色", w)
btn.move(100, 30)
qc = QColorDialog(w)  # 创建颜色选择框
qc.colorSelected.connect(lambda val: print(val))  # 也可以通过信号来获取颜色

btn.clicked.connect(getColor_)

w.show()
sys.exit(app.exec_())
2.6.3.2.2 选项控制

使用方法和QFontDialog的类似:【[选项控制](#2.6.2.2.2 选项控制)】

2.6.3.2.3 静态方法
customCount()  # 获取可存储的最大自定义的颜色个数
setCustomColor(int index, QColor)  # 设置自定义颜色
setStandardColor(int index, QColor)  # 设置标准颜色
getColor(*args, **kwargs)  # 参数查看源码
# ret = QColorDialog.getColor(QColor(), w, "选择颜色")
# print(ret)  # 如果碘酒取消会使用默认颜色

2.6.3.3 信号

colorSelected(QColor)
currentColorChanged(QColor)

2.6.4 QFileDialog

2.6.4.1 描述

提供了一个对话框,允许用户选择文件或目录;允许用户遍历文件系统,以选择一个或多个文件或目录

继承自QDialog

2.6.4.2 功能作用

2.6.4.2.1 静态方法

获取文件

getOpenFileName()  # 获取以打开的文件名称
getOPenFileNames()
getOpenFileUrl()  # 获取已打开文件的路径,QUrl 类型的数据
getOPenFileUrls()
getSaveName()  # 获取保存文件的名称
getSaveFileUrl()  # 获取保存文件名称的路径

获取文件夹

getExistingDirectory()  # 选择某一个文件夹,返回文件夹名称
getExistingDirectoryUrl()  # 返回文件夹的路径

注意:参数请从源码中获取

2.6.4.2.2 构造函数
QFileDialog(QWidget, Union[Qt.WindowFlags, Qt.WindowType])
QFileDialog(parent: QWidget = None, caption: str = '', directory: str = '', filter: str = '')

参数说明:

  • parentt:父控件
  • caption:窗口标题
  • directory:默认打开的目录
  • filter:设置过滤器
2.6.4.2.3 接收模式
acceptMode()
setAcceptMode(QFileDialog.AcceptMode)  # 设置接收模式

QFileDialog.AcceptMode

  • QFileDialog.AcceptOpen:打开文件
  • QFileDialog.AcceptSave:保存文件
2.6.4.2.4 其他功能
# 设置默认后缀名
setDefaultSuffix(str)  # str为文件后缀名,不需要加点

# 设置文件模式
setFileMode(QFileDialog.FileMode)

# 设置过滤器
setNameFilter(str filter)  # 里面输入过滤器
setNameFilters(iterator filters)  # 里面传入过滤器的可迭代对象

# 显示信息的详细程度
setViewMode(QFileDialog.ViewMode)

# 设置指定角色的标签名称
setLabelText(QFileDialog.DialogLabel, str new_name)  # QFileDialog.DialogLabel 详细信息请到源码查看

参数:

QFileDialog.FileMode

  • QFileDialog.AnyFile:任何文件,无论是否存在
  • QFileDialog.ExistingFile:单个存在的文件
  • QFileDialog.Directory:目录名称,显示文件和目录
  • QFileDialog.ExistingFiles:单个或多个现有的文件名称

filter

  • 如:"All(*.*);;Image(*.jpg *.jpeg)"

filters

  • 如:["All(*.*)", "Image(*.jpg *.jpeg)"]

QFileDialog.ViewMode:

  • QFileDialog.Detail:详细信息
  • QFileDialog.List:列表形式

2.6.4.3 信号

currentChanged(path_str)  # 当前路径发生改变时
currentUrlChanged(QUrl)  # 当前路径url发生改变时,和上一个的主要区别是返回值不一样
directoryEntered(directory_str)  # 打开选中文件夹时
directoryUrlEntered(Qurl)  # 打开选中文件夹url时
filterSelected(filter_str)  # 选择名称过滤器时

fileSelected(str)
filesSelected([strs])
urlSelected(QUrl)
urlsSelected([QUrls])

2.6.5 QInputDialog

2.6.5.1 描述

提供了一个简单方便的对话框,获得来自用户的单个值;输入值可以是字符串、数字或者列表中的项目;设置标签以告知用户应输入的内容

继承自QDialog

2.6.5.2 功能作用

2.6.5.2.1 静态方法
getInt()
getDouble()
getText()
getMultiLineText()
getItem()

参数请通过源码来获取

2.6.5.2.2 选项设置
setOption(QInputDialog.InputDialogOption, on=True)  # on参数表示是否启用该选项,默认为True
setOptions(QInputDialog.InputDialogOption)  # 设置多个选项
testOption(QInputDialog.InputDialogOption)  # 测试某个选项是否生效
options()  # 获取当前的选项

QInputDialog.InputDialogOption

  • QInputDialog.NoButtons:不显示确定和取消按钮,对实时对话框有用
  • QInputDialog.UseListViewForComboxItems:使用QListView而不是不可编辑的QComboBox来显示使用setComboBoxItems()
  • QInputDialog.UsePlainTextEditForTextInput:使用QPlainTextEdit进行多行文本输入
2.6.5.2.3 输入模式
inputMode()  # 获取输入模式
setInputMode(QInputDialog.InputMode)  # InputMode: DoubleInput/ IntInput/ TextInput
2.6.5.2.4 界面文本
setLabelText(str)
setOkButton(str)
setCancelButton(str)
2.6.5.2.5 小分类设置
2.6.5.2.5.1 浮点型
setDoubleMaximum(float)
setDoubleMinimum(float)
setDoubleRange(float min, float max)
setDecimals(int)  # 设置精确位数
setDoubleStep(float)
setDoubleValue(float)
2.6.5.2.5.2 整型
setIntMaximum(int)
setIntMinimum(int)
setIntRange(int min, int max)
setIntStep(int)
setIntValue(int)
2.6.5.2.5.3 字符串型
setTextEchoMode(QLineEdit.EchoMode)
setTextValue(str)
2.6.5.2.5.4 下拉列表型
setComboBoxItems(Iterator[str])
setComboBoxEditable(bool)

2.6.5.3 信号

intValueChanged(int)
intvalueSelected(int)
doubleValueChanged(float)
doublValueSelected(float)
textValueChanged(str)
textValueSelected(str)

2.7.1 QCalendarWidget

2.7.1.1 描述

提供了一个基于每月日历控件,允许用户选择一个日期

继承自QWidget

2.7.1.2 功能作用

2.7.1.2.1 基础方法
# 设置日期范围
setMaximumDate(QDate)
setMinimumDate(QDate)
setDateRange(QDate min, QDate max)

# 日期编辑
setDateEditEnabled(bool)  # 默认可编辑
setDateEditAcceptDelay(int)  # 设置编辑后的延迟秒数,单位为 ms

# 日期获取
selectDate()
monthShown()
yearShown()
2.7.1.2.2 格式外观
# 设置导航条是否可见
setNavigationBarVisible(bool)
isNavigationBarVisible()

# 一周的第一天
setFirstDayOfWeek(Qt.DayOfWeek)

# 网格显示
setGridVisible(bool)
isGridVisible()
2.7.1.2.3 文本格式
setHeaderTextFormat(QTextCharFormat)  # 包含水平头和垂直头
setHorizontalHeaderFormat(QCalendarWidget.HorizontalHeaderFormat)
setVerticalHeaderFormat(QCalendarWidget.VerticalHeaderFormat)
setWeekdayTextFormat(Qt.DayOfWeek, QTextCharFormat)
setDateTextFormat(QDate, QTextCharFormat)
2.7.1.2.4 选中
setSelectionDate(QDate)
setSelectionMode(QCalendarWidget.SelectionMode)

QCalendarWidget.SelectionMode

  • QCalendarWidget.NoSelection:不可以选择单日期
  • QCalendarWidget.SingleSelection:可以选择单日期
2.7.1.2.5 常用方法
showToday()
showSelectedDate()
showNextYear()
showPreviousYear()
showNextMonth()
showPreviousMonth()
setCurrentPage(int year, int month)

2.7.1.3 信号

actived(QDate)  # 只要用户按下return或enter键或双击日历小部件中的日期,就会发出信号
clicked(QDate)  # 单击有效日期才会发出信号
currentPageChanged(int year, int month)  # 当前显示的月份更改时会发出此信号,新的一年和新的一月作为参数传递
selectionChanged()  # 当前选择的日期发生改变时会发出此信号,代码或鼠标修改