Home > PyQt5, python > PyQt5: QLineEdit

PyQt5: QLineEdit

14 Marzo 2019

Torna all’indice degli appunti

Le textbox sulle Qt sono le QLineEdit.
Il costruttore è quindi QLineEdit. Solitamente le textbox vengono create vuote, ma può essere utile prepopolarle con un testo.
I metodi per fare questo sono setText ed insert.
Il secondo metodo inserisce un testo in coda a quello esistente.
Per ottenere il testo contenuto nella textbox, come per la label, si usa il metodo text.

>>> from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QLineEdit
>>> app = QApplication([])
>>> label = QLineEdit()
>>> label.setText("first text")
>>> label.text()
'first text'
>>> label.insert(", second one")
>>> label.text()
'first text, second one'

Se vogliamo che la textbox in fase di creazione della UI, abbia già un testo predefinito, possiamo utilizzare il metodo
setPlaceholderText

Di default la textbox permette di scrivere 32767 caratteri. Se vogliamo limitare la quantità, possiamo utilizzare il metodo setMaxLenght

Se vogliamo che il contenuto della textbox non venga modificato, possiamo utilizzare il metodo setReadOnly

Vediamo un esempio pratico

from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QLineEdit
from PyQt5.QtWidgets import QMainWindow
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QButton Example")
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)
        self.resize(200, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)

        label = QLineEdit()
        label.setPlaceholderText("Write here your text")
        # label.setReadOnly(True)  # read-only
        layout.addWidget(label, 0)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Completer

Il completer è un oggetto QCompleter che ci permette di utilizzare la funzione di auto-completamento in fase di scrittura all’interno di un widget come il QLineEdit.
Prende in ingresso una lista di stringhe che verranno proposte nel momento della scrittura all’interno della textbox:

...
from PyQt5.QtWidgets import QCompleter

...
        names = ['Andrea', 'Asia', 'Alessio', 'Sara']
        completer = QCompleter(names)
        label.setCompleter(completer)

...


Dimensioni e colore

Valgono tutti i metodi utilizzati negli esempi di QLabel

Selezione Testo

Ci sono alcuni metodi utili per selezionare ed estrapolare il testo presente nella textbox.
Con il metodo selectAll, seleziono tutto il testo e con il metodo selectedText ritorno il testo selezionato.
Per deselezionare il testo si utilizza il metodo deselect e per assicurarsi che ci sia o meno testo selezionato,
utilizziamo il metodo hasSelectedText:

>>> label.setText("first text")
>>> label.selectAll()
>>> label.hasSelectedText()
True
>>> label.deselect()
>>> label.hasSelectedText()
False

Per selezionare porzioni di testo, si utilizza il metodo setSelection, che prende in ingresso lo startindex della stringa e quanti caratteri selezionare:

>>> label.deselect()
>>> label.setSelection(6, 3)
>>> label.selectedText()
'tex'

Se vogliamo sapere quali sono gli indici della selezione, usiamo i metodi selectionStart e selectionEnd:

>>> label.selectionStart()
6
>>> label.selectionEnd()
9

Segnali

I Segnali pyqtSignal collegabili al widget QLineEdit sono:

selectionChanged: il segnale viene emesso quando il tipo di selezione effettuata sul testo, cambia:

>>> label.selectionChanged.connect(lambda : print("ALERT: Selection Changed!"))
<PyQt5.QtCore.QMetaObject.Connection object at 0x0373BE70>
>>> label.setSelection(6, 3)
>>> label.selectAll()
ALERT: Selection Changed!

cursorPositionChanged: il segnale viene emesso quando cambia la posizione del cursore all’interno della stringa:

>>> label1 = QLineEdit()
>>> label1.setText("a")
>>> label1.insert("b")
>>> label1.insert("c")
>>> label1.text()
'abc'
>>> label1.selectionChanged.connect(lambda : print("ALERT: Selection Changed!"))
<PyQt5.QtCore.QMetaObject.Connection object at 0x0373BDF0>
>>> label1.cursorPositionChanged.connect(lambda : print("ALERT: cursor position changed!"))
<PyQt5.QtCore.QMetaObject.Connection object at 0x0373BD70>
>>> label1.selectAll()
ALERT: Selection Changed!
>>> label1.setSelection(1, 1)
ALERT: Selection Changed!
ALERT: cursor position changed!
>>> label1.text()
'abc'
>>> label1.selectedText() #  position 1 length 1
'b'

textChanged: il segnale viene emesso quando il testo viene modificato.

Attenzione!
Se il cursore è stato modificato in precedenza, qualora si utilizzasse il metodo insert per aggiungere testo,
questi verrebbe aggiunto nell’ultima posizione del cursore (setSelection).

>>> label1.textChanged.connect(lambda : print("ALERT: text changed!"))
<PyQt5.QtCore.QMetaObject.Connection object at 0x0373BDB0>
>>> label1.insert("d")
ALERT: text changed!
ALERT: Selection Changed!
>>> label1.text()
'adc' 

Per spostare il cursore è possibile usare il metodo setCursorPosition:

>>> label1.setCursorPosition(0)
ALERT: Selection Changed!
ALERT: cursor position changed!
>>> label1.insert("1")
ALERT: text changed!
ALERT: cursor position changed!
>>> label1.setCursorPosition(len(label1.text()))
ALERT: cursor position changed!
>>> label1.insert("2")
ALERT: text changed!
ALERT: cursor position changed!
>>> label1.text()
'1adc2'

Gli altri segnali disponibili sono apprezzabili sulla UI

returnPressed: segnale emesso quando premiamo INVIO dopo avere editato il testo
editingFinished: simile a returnPressed, ma in questo caso incide anche la perdita del Focus sulla textbox.
inputRejected: segnale emesso quando si premono tasti non consentiti da eventuali validator,
o quando finiamo oltre il limite massimo consentito di caratteri
textEdited: segnale emesso quando il testo viene editato

...
        label = QLineEdit()
        label.setPlaceholderText("Write here your text")
        label.setMaxLength(10)

        label.returnPressed.connect(self.on_return_pressed)
        label.editingFinished.connect(self.on_editing_finished)
        label.inputRejected.connect(self.on_input_rejected)
        label.textEdited.connect(self.on_text_edited)
        layout.addWidget(label, 0)
        self.setLayout(layout)

    def on_return_pressed(self):
        print("INFO: You have pressed <Return Key>")

    def on_editing_finished(self):
        print("INFO: You have finished")

    def on_input_rejected(self):
        print("ERROR: Input rejected")

    def on_text_edited(self):
        print("INFO: You're editing text...")
...

Validation

La validazione può essere effettuata grazie agli oggetti QRegExp e QRegExpValidator.
Il primo costruttore prende come argomento il pattern regex da utilizzare.
Il secondo costruttore perende come argomenti l’oggetto QRegExp appena istanziato e il widget soggetto
a validazione.
Infine si setta tale oggetto QRegExpValidator al widget con il metodo setValidator.
Come si vede nell’esempio di seguito, quando verranno premuti i caratteri proibiti, non verrenno inseriti nella textbox:

...
from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator
...

        label = QLineEdit()
        label.setPlaceholderText("Write here your text")
        label.setMaxLength(10)

        reg_ex = QRegExp("[a-z-A-Z_]+")
        label_validator = QRegExpValidator(reg_ex, label)
        label.setValidator(label_validator)

        label.inputRejected.connect(self.on_input_rejected)

        layout.addWidget(label, 0)
        self.setLayout(layout)

    def on_input_rejected(self):
        print("ERROR: Input rejected")
...

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.