专栏首页Python编程 pyqt matplotlibPyQt5 对话框 数据验证

PyQt5 对话框 数据验证

本篇介绍PyQt5对话框的数据合法性的验证。有两种验证方式:预防式验证(preventative)和 提交后验证 (post-mortem)。预防式验证适合于单个部件的数据验证,可以通过选择合适的部件类型,设置最大字符长度或者数字的大小范围,应用正则表达式等等来进行预防式验证。提交后验证可应用于单个控件,也可应用于多部件交叉验证。两种验证策略可单独或者组合使用。

具体的运用请参见如下代码:

import sys from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.Qt import QRegExp,QRegExpValidator from PyQt5.QtWidgets import *

#非模态对话框("Apply"型更新),自定义信号,数据验证,正则表达式,掩码

class NumberFormatDlg(QDialog): changed = pyqtSignal()#自定义信号 def __init__(self,format_,parent=None): super().__init__(parent) thousandsLabel = QLabel("&Thousands seprator") self.thousandsEdit = QLineEdit(format_["thousandsseparator"]) self.thousandsEdit.setMaxLength(1)

#正则表达式 punctuationRe = QRegExp(r"[ ,;:.]") #只能为中括号内的某个字符,还可以为空 #设定验证方式为正则表达式,不合规的字符输入不进去。预防式验证 self.thousandsEdit.setValidator(QRegExpValidator(punctuationRe,self)) thousandsLabel.setBuddy(self.thousandsEdit)

decimalMarkerLabel = QLabel("Decimal &marker") self.decimalMarkerEdit = QLineEdit(format_["decimalmarker"]) self.decimalMarkerEdit.setMaxLength(1) self.decimalMarkerEdit.setValidator(QRegExpValidator(punctuationRe,self)) self.decimalMarkerEdit.setInputMask("X")#设定掩码 decimalMarkerLabel.setBuddy(self.decimalMarkerEdit)

decimalPlacesLabel = QLabel("&Decimal places") self.decimalPlacesSpinBox = QSpinBox() self.decimalPlacesSpinBox.setRange(0,6) self.decimalPlacesSpinBox.setValue(format_["decimalplaces"])

decimalPlacesLabel.setBuddy(self.decimalPlacesSpinBox)

self.redNegativesCheckBox = QCheckBox("&Red negative numbers") self.redNegativesCheckBox.setChecked(format_["rednegatives"])

buttonBox = QDialogButtonBox(QDialogButtonBox.Apply | QDialogButtonBox.Close)

buttonBox.button(QDialogButtonBox.Apply).clicked.connect(self.apply) buttonBox.rejected.connect(self.reject)

grid = QGridLayout() grid.addWidget(thousandsLabel,0,0) grid.addWidget(self.thousandsEdit,0,1) grid.addWidget(decimalMarkerLabel,1,0) grid.addWidget(self.decimalMarkerEdit,1,1) grid.addWidget(decimalPlacesLabel,2,0) grid.addWidget(self.decimalPlacesSpinBox,2,1) grid.addWidget(self.redNegativesCheckBox,3,0,1,2) grid.addWidget(buttonBox,4,0,1,2) self.setLayout(grid)

self.setWindowTitle("数字格式设置(非模态)")

self.format = format_

def apply(self): thousands = self.thousandsEdit.text() decimal = self.decimalMarkerEdit.text()

#提交后验证 #交叉验证 if thousands == decimal: QMessageBox.warning(self,"格式错误","千位分隔符和小数点符不能相同") self.thousandsEdit.selectAll() self.thousandsEdit.setFocus() return if decimal == '': QMessageBox.warning(self,"格式错误","小数点符不能为空") self.decimalMarkerEdit.selectAll() self.decimalMarkerEdit.setFocus() return

self.format["thousandsseparator"] = thousands self.format["decimalmarker"] = decimal self.format["decimalplaces"] = self.decimalPlacesSpinBox.value() self.format["rednegatives"] = self.redNegativesCheckBox.isChecked() self.changed.emit()#发射自定义信号

class MainDialog(QDialog): def __init__(self,parent=None): super(MainDialog,self).__init__(parent) format_ = dict(thousandsseparator =",",decimalmarker=".",decimalplaces = 3,rednegatives =True) self.dialog = NumberFormatDlg(format_) button = QPushButton("click here",self) button.clicked.connect(self.dialog.show) app = QApplication(sys.argv) font= MainDialog() font.show() app.exec_()

本文分享自微信公众号 - Python编程 pyqt matplotlib(wsplovePython),作者:wsp

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PyQt5 非模态对话框(live 型)

    本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动...

    用户6021899
  • PyQt5 非模态对话框(apply 型)

    如果希望用户可以重复更改对话框中的参数并能马上看到修改结果,那么就要使用非模态对话框,这样用户就可以按照他们喜欢的方式来持续不断地修改数据并验证修改的结果了。

    用户6021899
  • PyQt5 多文档窗口界面

    本篇介绍多文档窗口界面的写法。代码中并未实现关闭窗口前文档未保存的提醒对话框,因为之前已有介绍。

    用户6021899
  • iOS 自定义分段控制器

    最近做项目时遇到一些问题,就是项目里原有分段控制器的适用范围有些局限,虽然网上也有很多分段控制器的demo,但自己写的,可控性和项目适用性自己能很明白,所以我专...

    清墨
  • Python魔术方法-Magic Method

    目录[-] 介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,例如类的初始化方法 __init__ ,Pyt...

    jhao104
  • Tiknter例子3

    ============================================

    py3study
  • Python魔法方法指南

    什么是魔法方法呢?它们在面向对象的Python的处处皆是。它们是一些可以让你对类添加“魔法”的特殊方法。 它们经常是两个下划线包围来命名的(比如 __init_...

    py3study
  • python 长连接 mysql数据库

    python链接mysql中没有长链接的概念,但我们可以利用mysql的ping机制,来实现长链接功能

    py3study
  • 高效处理流量加解密——Burpy

    先来地址:Github: https://github.com/mr-m0nst3r/Burpy

    用户2202688
  • Seleninum&PhamtomJS爬取煎蛋网妹子图

    mylog.py  日志模块,记录一些爬取过程中的信息,在大量爬取的时候,没有log帮助定位,很难找到错误点

    py3study

扫码关注云+社区

领取腾讯云代金券