GLHF
GLHF

Reputation: 4035

How to make QLineEdit-QCompleter upperlines automatically

I have a list of texts, if the user search for a text in QLineEdit, I print the text. There is a QCompleter in QLineEdit.

The problem is, as we know Text and text are not same, but it's same to the user. So If user starts typing Text or text, I want to change it to the TEXT real time in QLineEdit. So whenever the user types a letter, I want to make it uppercase in QCompleter-QLineEdit. How can I do this? I have this atm;

from PyQt5.QtWidgets import QApplication,QPushButton,QMainWindow,QLabel,QLineEdit,QCompleter
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import QPoint
import sys

class cssden(QMainWindow):
    def __init__(self):
        super().__init__()
        self.mwidget = QMainWindow(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        #size
        self.setFixedSize(600,400)

        #LINE EDIT QCOMPLETER
        self.label = QLineEdit(self)
        self.label.setGeometry(100,100,300,30)
        self.label.setStyleSheet("color: red;"
                                "font: bold 15pt 'Arial';")

        self.t = ["Hello","hi","Hey"]
        self.label.setCompleter(QCompleter(self.t, self))

        #BUTTON
        self.buton = QPushButton(self)
        self.buton.setText("Click")
        self.buton.setGeometry(200,140,90,50)

        self.buton.clicked.connect(self.hangiButon)

        #SET LABEL
        self.set_label = QLabel(self)
        self.set_label.setGeometry(100,300,900,100)
        self.set_label.setStyleSheet("color: green;"
                                    "font: bold 18pt 'Times New Roman';")
        self.show()


    def hangiButon(self):
        print(self.label.text(), self.t.index(self.label.text())+1)
        self.set_label.setText("Pressed to --> {}.".format(self.label.text().rstrip()))

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

app = QApplication(sys.argv)
app.setStyleSheet("QMainWindow{background-color: rgb(30,30,30);border: 2px solid rgb(20,20,20)}")

ex = cssden()
sys.exit(app.exec_())

So if I press h I want to see all of the words, not only hi and I want to change that h immediately. But couldn't figure out how.

Upvotes: 1

Views: 4070

Answers (1)

jDo
jDo

Reputation: 4010

The QCompleter widget has a setCaseSensitivity property that takes a QtCore.Qt.CaseSensitive / QtCore.Qt.CaseInsensitive or simply a 1 or 0 (docs).

The Qt documentaion says that "The default is Qt::CaseSensitive."

Changing the property to case-insensitive matching:

self.t = ["Hello","hi","Hey"]
my_completer = QCompleter(self.t, self)
my_completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
# my_completer.setCaseSensitivity(0)
self.label.setCompleter(my_completer)

To change the user input to uppercase you could add a method that changes the text:

def to_upper(self, txt):
    self.label.setText(txt.upper())

which can then be connected to events such as self.label.textChanged:

self.label.textChanged.connect(self.to_upper)

Putting it together:

from PyQt5.QtWidgets import QApplication,QPushButton,QMainWindow,QLabel,QLineEdit,QCompleter
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import QPoint
import sys

class cssden(QMainWindow):
    def __init__(self):
        super().__init__()
        self.mwidget = QMainWindow(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        #size
        self.setFixedSize(600,400)

        #LINE EDIT QCOMPLETER
        self.label = QLineEdit(self)
        self.label.setGeometry(100,100,300,30)
        self.label.setStyleSheet("color: red;"
                                "font: bold 15pt 'Arial';")

        self.label.textChanged.connect(self.to_upper)

        self.t = ["Hello","hi","Hey"]
        my_completer = QCompleter(self.t, self)
        #my_completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        my_completer.setCaseSensitivity(0)
        self.label.setCompleter(my_completer)

        #BUTTON
        self.buton = QPushButton(self)
        self.buton.setText("Click")
        self.buton.setGeometry(200,140,90,50)

        self.buton.clicked.connect(self.hangiButon)

        #SET LABEL
        self.set_label = QLabel(self)
        self.set_label.setGeometry(100,300,900,100)
        self.set_label.setStyleSheet("color: green;"
                                    "font: bold 18pt 'Times New Roman';")
        self.show()

    def to_upper(self, txt):
        self.label.setText(txt.upper())

    def hangiButon(self):
        print(self.label.text(), self.t.index(self.label.text())+1)
        self.set_label.setText("Pressed to --> {}.".format(self.label.text().rstrip()))

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

app = QApplication(sys.argv)
app.setStyleSheet("QMainWindow{background-color: rgb(30,30,30);border: 2px solid rgb(20,20,20)}")

ex = cssden()
sys.exit(app.exec_())

Upvotes: 6

Related Questions