PyQt5 和 Python 中的用户输入验证
问题描述
这是一个关于输入验证的两部分问题,其中包含一个特定组件和另一个更通用的组件.
This is a two part question about input validation with one specific and another more general component.
具体:
在研究该主题时,我发现 THIS on Regular表达式.我意识到这篇文章中的代码使用的是 PyQt4.但是我想让它与 PyQt5 一起工作,因为我已经用它开始了我的项目.(显然是盲目的——我只能找到它的 C++ 文档)
While researching the topic, I found THIS on Regular Expressions. I realize that the code in this post is using PyQt4. However I wanted to get this working with PyQt5, since I had already started my project with it. (Obviously blindly - I can only find C++ documentation for it)
这是我尝试过的:
# somewhere above:
self.le_input = QtWidgets.QLineEdit()
# at some point validate_input gets called:
# more on that in the second part of this question
def validate_input(self):
reg_ex = QtCore.QRegExp(""[0-9]+.?[0-9]{,2}"")
input_validator = QtGui.QRegExpValidator(reg_ex, self.le_input.text())
self.le_input.setValidator(input_validator)
当我运行代码时,出现以下错误:
When I run the code I get the following Error:
QRegExpValidator(parent: QObject = None): 参数 1 具有意外类型 'QRegExp'QRegExpValidator(QRegExp, parent: QObject = None): 参数 2 具有意外类型 'str'
QRegExpValidator(parent: QObject = None): argument 1 has unexpected type 'QRegExp' QRegExpValidator(QRegExp, parent: QObject = None): argument 2 has unexpected type 'str'
这些不正是需要的参数吗?有谁知道如何让这个工作?
Aren't these exactly the required arguments? Does anyone know how to get this working?
将军:
在 Python 中使用 PyQt 实现实时验证的有效方法是什么?
What is an effective way to implement live validation with PyQt in Python?
目前我会使用:
self.le_input.textChanged.connect(self.validate_input)
这确实有效,但是一旦我尝试将两个相互影响的 QtLineEdits 连接到同一个插槽,事情就会停止工作,因为它们同时调用了textChanged".
This does work, but as soon as I try to connect two QtLineEdits, that affect each other, to the same slot, things stop working because "textChanged" gets called by both of them at the same time.
用例:两个输入字段:Amount before TAX
和 Amount after TAX
- 输入时自动填充另一个字段.
Use case: Two input fields: Amount before TAX
and Amount after TAX
- and whichever you enter automatically fills the other one while typing.
先验证,再计算,再输出到其他字段.
First validation, then calculation, then output to the other field.
提前非常感谢!非常感谢任何帮助!
解决方案
你可以为不同的QLineEdit
对象设置不同的验证器.
You can set different validators for different QLineEdit
objects.
QRegExpValidator
有两个构造函数:
QRegExpValidator(parent: QObject = None)
QRegExpValidator(QRegExp, parent: QObject = None)
所以,您应该将代码更改为:
so, you should change your code to:
reg_ex = QRegExp("[0-9]+.?[0-9]{,2}")
input_validator = QRegExpValidator(reg_ex, self.le_input)
self.le_input.setValidator(input_validator)
一旦为 QLineEdit 设置了验证器,就不需要使用了
Once you set validator for QLineEdit, there is no need to use
self.le_input.textChanged.connect(self.validate_input)
删除即可.这应该可以正常工作.
Just delete it. And that should work fine.
如果您想查找有关 PyQt5 的文档,您可以在控制台中简单地使用它:
If you want to find documentation about PyQt5, you can simple use this in your console:
pydoc3 PyQt5.QtGui.QRegExpValidator
但是 pydoc 只能显示很少的信息,所以你也应该使用 C++ 版本的文档.
But pydoc can only show you little information, so you should use C++ version documation as well.
最后,举个例子:
from PyQt5.Qt import QApplication
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator
from PyQt5.QtWidgets import QWidget, QLineEdit
import sys
class MyWidget(QWidget):
def __init__(self, parent=None):
super(QWidget, self).__init__(parent)
self.le_input = QLineEdit(self)
reg_ex = QRegExp("[0-9]+.?[0-9]{,2}")
input_validator = QRegExpValidator(reg_ex, self.le_input)
self.le_input.setValidator(input_validator)
if __name__ == '__main__':
a = QApplication(sys.argv)
w = MyWidget()
w.show()
a.exec()
相关文章