香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题

这篇具有很好参考价值的文章主要介绍了香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PyQt开发中,时常需要对控件的值进行校验,如需要校验QCheckBox是否被选中,QLabel是否校验值是否为空等等。在复杂的业务场景下,这类控件如果数量很多,逐个校验就显得麻烦,需要一一获得控件名称,再调用对应的方法来判断是否被选中、是否为空等。而且开发过程中如果多控件做了增减,还需要增减校验的逻辑,那会要了老命。

此篇文章,推荐使用__dict__属性 + 字典映射来快速校验控件值,并且无视后面控件的增减,无需调整代码。

__dict__是什么?

python开发的,或多或少都接触过该属性,它是独有的一个特性,用来保存的一些属性,关于这个属性的相关文章,网上一抓一大把,此处不作赘述,需要说明的是,类实例也有自己的__dict__属性,而且和__dict不同,``类实例dict只保存了通过self.xxx`所声明的属性和方法。

校验逻辑演示

接下来的演示中,仅使用QCheckBox(为了省事),同时要保持这些控件的名称要具备同样的特征,下面的截图中,所有的控件名称都以checkbox结尾。

1、使用.ui文件生成.py文件

2、简单写个入口程序

继承刚才生成的.py文件,在这里可以实现自己的方法,在自定义类中,先打印__dict__,看看有哪些值。

{
  'centralwidget': <PyQt6.QtWidgets.QWidget object at 0x00000231DD4E9D30>, 
  'gridLayout': <PyQt6.QtWidgets.QGridLayout object at 0x00000231DD4E9DC0>, 
  'c_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD4E9E50>, 
  'd_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD4E9EE0>, 
  'a_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD4E9F70>, 
  'b_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD9A3040>, 
  'f_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD9A30D0>, 
  'e_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD9A3160>, 
  'menubar': <PyQt6.QtWidgets.QMenuBar object at 0x00000231DD9A31F0>, 
  'statusbar': <PyQt6.QtWidgets.QStatusBar object at 0x00000231DD9A3280>
}

可以看到,它是一个字典,它包含了界面上所有的控件的名称和实例对象,这里就体现出了控件名称命名时遵守统一特征的好处了,即能望文生义,也方便处理。

3、提取所有QCheckBox的控件名称,构建一个校验的通用逻辑

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication, QCheckBox
from ui_main import Ui_MainWindow

class MainWindow(Ui_MainWindow, QMainWindow):
    def __init__(self):
        super().__init__()
        super().setupUi(self)
        self.show()
        self.checkboxs()

    
    def checkboxs(self):
        # print(self.__dict__)

        # 增加这个字典映射是为了可以自动处理更多类型的控件值校验
        widget_mapping = {
            'QCheckBox': QCheckBox.isChecked
        }
        
        # 获取所有QCheckBox的控件名称
        boxs = [
            item for item in self.__dict__ \
                if item.endswith('_checkbox')
        ]

        # 用来保存未被勾选的控件
        un_checked = []

        for item in boxs:
            widget_instance = self.__dict__.get(item)
            widget_method = widget_mapping.get(
                self.__dict__.get(item).__class__.__name__
            )
            # 如果该QCheckBox处于未选中,则被添加到列表中
            if not widget_method(widget_instance):
                un_checked.append(item)

        print(un_checked)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

4、逻辑分析

(1)
在代码

boxs = [
            item for item in self.__dict__ \
                if item.endswith('_checkbox')
        ]

中,通过__dict__提取了所有以_checkbox结尾的控件名称,注意,这只是字符串而已,并非控件本身。

(2)构建一个通用的控件名称和控件方法的字典映射

# 增加这个字典映射是为了可以自动处理更多类型的控件值校验
        widget_mapping = {
            'QCheckBox': QCheckBox.isChecked
        }

这么做的目的是为了让这个逻辑更具通用性,让这个逻辑兼容其他控件,简单来说,可以通过控件的名称(boxs列表)找到该控件对应的方法,因为每个控件获取值所用的方法不尽相同。

(3)遍历boxs列表,逐个去widget_mapping找对应的方法,假如这里要较多种控件的话,字典映射的优势就体现出来了。widget_method就是该控件获取值所要用的方法了,QCheckBox控件,就用isChecked方法来获取控件是否被选中。

(4)调用所找到的方法widget_method。这里之所以要把控件实例widget_instance传入方法中,是因为控件方法isChecked是单独调用的,它默认要传入self参数即实例本身。

运行代码看看效果

可以看到6个选项均为选中,打印结果符合该事实。

qt desinger中默认勾选两个,再试试效果

有4个未选中,打印结果符合事实。

总结

上面的仅为演示代码,只是演示处理此类问题的逻辑,刚构建逻辑时会显得很绕,但是构建起来后就很好用了,如果再渐增控件,只要遵守控件名称命名规范,那么所增加的控件校验也无需增加校验代码,减少控件也一样。

延申用法

如果一个界面中有很多控件需要填写数值或清空数值,如:

  • 提交表单后,控件数值初始化
  • 校验不通过,需要在控件中做信息提示(诸如placeholder)

一样可以使用这个逻辑进行处理,只要前期构建好,代码复用完全不是问题。文章来源地址https://www.toymoban.com/news/detail-414293.html

到了这里,关于香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 免费分享一套PyQt6学生信息管理系统 Python管理系统 Python源码,挺漂亮的

    大家好,我是java1234_小锋老师,看到一个不错的PyQt6学生信息管理系统 Python管理系统 Python源码,分享下哈。 【免费】PyQt5 学生信息管理系统 Python管理系统 Python源码 Python毕业设计_哔哩哔哩_bilibili 【免费】PyQt5 学生信息管理系统 Python管理系统 Python源码 Python毕业设计项目来自

    2024年02月03日
    浏览(41)
  • PySide6-控件教程-004-QLabel标签控件-数值类型、图形图像、动画

    本文摘录自我的开源教程:PySide6 代码式教程 - QLabel,CSDN 平台仅做镜像,答疑、纠错请至 GitHub 提交 issue。 QLabel 除了显示文本字符串外,还可以用于显示数值类型、图形图像、动图等 .setNum(num: int) 将标签设置为数值类型(int) .setNum(num: float) 将标签设置为数值类型(float)

    2023年04月24日
    浏览(47)
  • SV 逻辑数值、数组、队列、结构体、字符串

    目录 一、逻辑数值 二、变量转换 显示转换 隐式转换(不需要进行转换操作) 三、定宽数组 数组声明 多维数组声明 初始化和赋值   非合并数组 合并数组 基本数组操作 for和foreach 赋值:= 比较:==,!=    四、动态数组 数组定位 方法定位 with(指示sv如何搜索) 重复参数

    2023年04月12日
    浏览(31)
  • pyqt 控件隐藏

    针对于pyqt按钮按下后,触发事件让窗口显示或者不显示。 常用的有2种方式去隐藏显示的内容 第一种方式会进行隐藏,但是对应的控件也会隐藏,同时对PYQT的控件分布也会造成影响: 注释:pushButton可以替换其他控件,效果都是隐藏 2. 第二种,设置控件透明度,这样的优点

    2024年02月13日
    浏览(66)
  • 【PyQt】12-滑块、计数控件

    1、滑块控件 2、计数控件 这篇文章依旧没有总结

    2024年02月21日
    浏览(38)
  • pyqt 在tablewidget表格控件里添加 buttom按钮控件

       说明一下:在designer里!是没有办法再tablewidget的表格上添加其他控件了,按钮啊!标签啊!都不可以!你改样式表也没用! 所以只能再代码成面改了,你把.ui文件转成.py文件。在python文件里添加下面的代码就行!(要修改) 上面的代码都注释了,要改的会报错的,其他

    2024年02月13日
    浏览(33)
  • 【PyQT/Pysider】控件背景渐变

    这段样式表使用了 qlineargradient 函数来创建一个水平方向的线性渐变,从左到右渐变。 渐变起点 (x1:0, y1:0) 在左上角 渐变终点 (x2:1, y2:0) 在右上角 使用了四个颜色停止点: 在 0 处,颜色为 rgba(255, 178, 102, 255) 在 0.55 处,颜色为 rgba(235, 148, 61, 255) 在 0.98 处,颜色为 rgba(0, 0, 0,

    2024年03月17日
    浏览(39)
  • pyqt中有connect用法的控件

    在PyQt中,以下控件可以使用connect方法进行信号与槽的连接: QPushButton:连接点击按钮的信号clicked QAction:连接菜单项或工具栏按钮的信号triggered QComboBox:连接选择项发生改变的信号currentIndexChanged QLineEdit:连接文本内容改变的信号textChanged QRadioButton:连接单选按钮状态切换

    2024年02月16日
    浏览(26)
  • PyQt QTableWidget 表格控件的使用

    PyQT开发图形界面应用时,可用 QTableWidget 控件,以表格方式直观地显示二维表格形状的数据,如列表,数组、pandas DataFrame等。 如果你想用表格方式直接显示并操作数据库表时,选择 QTableView类更合适。 步骤如下: 生成QTableWidget对象 设置表头以及表格参数 构建 QTableWidgetIte

    2024年02月01日
    浏览(54)
  • 【PyQt】(自制类)处理鼠标点击逻辑

    写了个自认为还算不错的类,用于简化 mousePressEvent 、 mouseMoveEvent 和 mouseReleaseEvent 中的鼠标信息。 功能有以下几点: 鼠标当前状态 ,包括鼠标左/中/右键和单击/双击/抬起 鼠标防抖 (仅超出一定程度时才判断鼠标发生了移动),灵敏度可设置; 鼠标长按 (在鼠标长按并且未发

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包