设为首页 加入收藏

TOP

QLineEdit拾遗:数据的过滤、验证和补全(二)
2019-03-15 00:08:55 】 浏览:63
Tags:QLineEdit 拾遗 数据 过滤 验证
) const进行数据的验证,还有一个可选的fixup函数用于修复输入,不过一般来说很少有自行修复输入的需求,所以这里使用默认的实现,也就是什么都不做。

validate验证数据后返回数据是否合法,有QValidator::State类型的值表示:

  • QValidator::Invalid 数据不合法
  • QValidator::Intermediate 数据不完整需要进一步的输入
  • QValidator::Acceptable 数据合法

PyQt5中的接口稍微有些不同,处理第一个返回值的为QValidator::State之外还需要把inputpos原封不动地作为第二和第三个值返回,否则edit无法正确显示输入的数据。

你可以通过validatorsetValidator来获取和设置验证器。

因为额外引入了第三种状态,所以实现一个validator远比设置inputMask来的复杂,这里我们实现一个自定义的日期验证器用于配合CustomDateEdit(我知道这个工作交给QRegExpValidator会很简单),同时介绍如何实现一个验证器。

下面看看具体的代码,首先我们不需要为validator额外增加内容,只需要实现几个方法,因此不要要关注构造等行为:

class CustomDateva lidator(QValidator):
    """验证输入的是否是合法的年月日
    """
    def validate(self, input: str, pos: int):
        date = input.replace(' ', '')  # 去除占位符
        y, m, d = self.splitDate(date)
        if not (y and m and d):
            return QValidator.Intermediate, input, pos

        try:
            arrow.get(date, self.dateFormat())  # 如果解析失败代表日期输入不合法
        except Exception:
            return QValidator.Invalid, input, pos

        return QValidator.Acceptable, input, pos

    def dateFormat(self):
        """返回arrow库使用的日期解析格式,具体参见文档,这里与CustomDateEdit的inputMask保持一致
        """
        return self.tr('YYYY年M月D日')

    def splitDate(self, date: str):
        """分割日期成年,月,日,以便判断数据是
		    

袷淙胪暾 只要有某一部分为空就表明数据未输入结束 """ y, date = date.split(self.tr('年')) m, date = date.split(self.tr('月')) d = date.split(self.tr('日'))[0] return y, m, d

可以看到验证器的逻辑其实很简单。整个验证器加上帮助函数一共做了三件事:

  1. 首先去除占位符,如前文所述
  2. 接着将输入信息按年月日分割,如果有某一部分为空则代表输入不完整
  3. 对于完整的输入则使用arrow解析成时间对象,失败则表示输入数据错误

其他的细节都已经在注释中说明。

如此一来我们既验证了数据的合法性又处理了所有可能的输入情况。当然,通常我更建议你使用现有的QDoubleva lidatorQRegExpValidator等现有的验证器,或将它们组合使用,这样更简单也更不容易出错。

自动补全——QCompleter

我们已经讲解了输入的过滤和验证,最后该讲讲补全了。

可以说过滤和验证是比较常用的功能的话,那补全就没有那么常见了。或者说,通常我们不需要关心它,比如QComboBox自带了QCompleter,它工作得也很好,所以我们往往忽略了它的存在。当然不只是下拉框,在QLineEdit中我们也可以用它和它的派生类实现补全效果。

功能:QCompleter包含了一个叫completeModel的数据模型,里面包含了用于根据输入信息进行补全的所有数据,通常是个listModel,也可以是设置了补全所用数据位于哪一列的tableModel,当然你还可以用treeModel,不过这超过了我们的讨论范围。

显示效果:completer从你输入的第一个字符开始匹配,如果在completeModel中找到了以输入内容开头的信息则会在edit下把所有匹配项一次放入一个下拉框并显示,你也可以设置为将第一个匹配项的数据替换放入edit。

还有一点我想额外补充一下,补全时弹出的下拉框其实是个view视图对象,因此你可以选择自己需要的视图以显示补全时想显示的自定义效果。

你可以通过completersetCompleter获取和设置completer。

可以看到只要把我们用于补全输入的数据放入合适的model中,再把model设置给completer,就能实现补全功能了。

下面看个设置completer的例子:

# model是一个QStandardItemModel,后面我们也会使用这个model来设置completer
completer = QCompleter()
model.setParent(completer)
completer.setModel(model)
edit.setCompleter(completer)

另外completer得到的数据是经过验证的,所以我们无需关心数据的格式和合法性。

现在我们已经把QLineEdit的数据处理流程介绍了一遍,有了这些预备知识下面该实现CustomDateEdit了。

CustomDateEdit的实现

我们先来看代码,细节问题基本在注释中给出了说明:

class CustomDateEdit(QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setInputMask(self.tr('9999年09月09日'))  # 设置日期格式的inputMask
        validator = CustomDateva lidator()
        self.setValidator(validator)  # 设置validator
        # 设置completer
        self._completer = QCompleter()
        self.setCompleter(self._completer)
        self.completerModel = QStandardItemModel(parent=self._completer)
        self._completer.setModel(self.completerModel)
        # 预先填充一些待补全内容
        self.addDateRecord("2019年03月14日")
        self.addDateRecord("2019年03月15日")

    def addDateRecord(self, text: str):

			
		  
编程开发网
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇django-3-模板变量,过滤器,金泰文.. 下一篇python函数学习1

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }