Search code examples
pythonpyqtpyqt5qcompleter

PyQt - Auto Completer with QLineEdit multiple times


I want to have the possibility to use multiple times the auto completer in my QLineEdit, I found example using QTextEdit but I can't find for QLineEdit. here is a piece of code I use (very simple one) :

from PyQt5.QtGui import * 
from PyQt5.QtCore import * 
from PyQt5.QtWidgets import *
import sys

def main():    
    app     = QApplication(sys.argv)
    edit    = QLineEdit()
    strList = ["Germany", "Spain", "France", "Norway"]
    completer = QCompleter(strList,edit)

    edit.setCompleter(completer)
    edit.show()

    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

For example, I want the completer to "start predicting" again the words in the same QLineEdit if I add a comma. Thanks.


Solution

  • I've found the answer if it can help others, I created a class for Completer :

    class Completer(QtWidgets.QCompleter):
    
        def __init__(self, parent=None):
            super(Completer, self).__init__(parent)
    
            self.setCaseSensitivity(Qt.CaseInsensitive)
            self.setCompletionMode(QtWidgets.QCompleter.PopupCompletion)
            self.setWrapAround(False)
    
        # Add texts instead of replace
        def pathFromIndex(self, index):
            path = QtWidgets.QCompleter.pathFromIndex(self, index)
    
            lst = str(self.widget().text()).split(',')
    
            if len(lst) > 1:
                path = '%s, %s' % (','.join(lst[:-1]), path)
    
            return path
    
        # Add operator to separate between texts
        def splitPath(self, path):
            path = str(path.split(',')[-1]).lstrip(' ')
            return [path]
    

    And I use it within a class for QLineEdit like :

    class TextEdit(QtWidgets.QLineEdit):
    
        def __init__(self, parent=None):
            super(TextEdit, self).__init__(parent)
    
            self.setPlaceholderText("example : ")
            self._completer = Completer(self)
            self.setCompleter(self._completer)