Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

User Input Validation in PyQt5 and Python

This is a two part question about input validation with one specific and another more general component.

The specific:

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)

This is what I tried:

# 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): 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?


The general:

What is an effective way to implement live validation with PyQt in Python?

At the moment I would use:

self.le_input.textChanged.connect(self.validate_input)

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.

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.

Many thanks in advance! Any help is highly appreciated!

like image 831
michaelh Avatar asked Dec 11 '16 15:12

michaelh


People also ask

What is input validation in Python?

Input validation code checks that values entered by the user, such as text from the input() function, are formatted correctly.

What is PyQt5 used for in Python?

PyQt is a Python binding for Qt, which is a set of C++ libraries and development tools providing platform-independent abstractions for graphical user interfaces (GUIs). Qt also provides tools for networking, threads, regular expressions, SQL databases, SVG, OpenGL, XML, and many other powerful features.

Does PyQt require Qt?

You can purchase the commercial version of PyQt here. More information about licensing can be found in the License FAQ. PyQt does not include a copy of Qt. You must obtain a correctly licensed copy of Qt yourself.

What is widget in PyQt5?

PyQt5 Tutorial — Getting started with PyQt5 In Qt (and most User Interfaces) 'widget' is the name given to a component of the UI that the user can interact with. User interfaces are made up of multiple widgets, arranged within the window.


1 Answers

You can set different validators for different QLineEdit objects.

QRegExpValidator has two constructors:

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)

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.

If you want to find documentation about PyQt5, you can simple use this in your console:

pydoc3 PyQt5.QtGui.QRegExpValidator

But pydoc can only show you little information, so you should use C++ version documation as well.

Finally, an example about this:

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()
like image 183
September Avatar answered Sep 23 '22 22:09

September