首页 > 解决方案 > Show completion list when qlineEdit textChanged

问题描述

I can use the following command to show an auto completion list view if I have a predefined list

wordList =["alpha", "omega", "omicron", "zeta"]
completer = QCompleter(wordList)
ineEdit.setCompleter(completer)

enter image description here

I need a different case:, Type something in lineEdit, when textChanged it connect to a function def searchAction: via lineEdit.textChanged.connect(searchAction). Inside def searchAction: i have an sql query which updates a list (say data_list) for every string I type in the lineEdit . If set wordList as data_list it does not do anything. My question how can I show the data_list as a autocompletion something like in the image.

标签: pythonpyqtpyqt5

解决方案


由于 QCompleter 支持模型,因此无需创建列表,因此您可以使用 QSqlQueryModel 进行过滤,如下所示:

import os
import sys
from pathlib import Path

from PyQt5.QtWidgets import QApplication, QCompleter, QLineEdit
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlQueryModel

CURRENT_DIRECTORY = Path(__file__).resolve().parent


def create_connection(path):
    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName(path)
    if not db.open():
        print(db.lastError().text())
        return False
    return True


class SqlQueryCompleter(QCompleter):
    def __init__(self, sql_model=None, parent=None):
        super().__init__(sql_model, parent)
        if sql_model is None:
            sql_model = QSqlQueryModel(self)
        elif not isinstance(sql_model, QSqlQueryModel):
            raise ValueError(f"The {sql_model} must be an instance of QSqlQueryModel")
        self.setModel(sql_model)
        self.setCompletionMode(QCompleter.UnfilteredPopupCompletion)

    def splitPath(self, path):
        if isinstance(self.model(), QSqlQueryModel):
            self.model().setQuery(self.query(path))
        return super().splitPath(path)

    def query(self, path):
        query = QSqlQuery("SELECT bar FROM 'foo' WHERE bar LIKE ?")
        query.addBindValue(f"%{path}%")
        if not query.exec_():
            print(query.lastError().text())
        return query


def main():
    app = QApplication(sys.argv)

    filename = os.fspath(CURRENT_DIRECTORY / "database.db")

    if not create_connection(filename):
        sys.exit(-1)

    line_edit = QLineEdit()
    line_edit.show()

    completer = SqlQueryCompleter()
    line_edit.setCompleter(completer)

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

推荐阅读