qlineEdit文本更改时显示完成列表

2024-10-01 22:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有预定义的列表,我可以使用以下命令显示自动完成列表视图

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

enter image description here

我需要一个不同的大小写:,在lineEdit中键入一些内容,当text更改它时,通过lineEdit.textChanged.connect(searchAction)连接到函数def searchAction:。在def searchAction:中,我有一个sql查询,它为我在lineEdit中键入的每个字符串更新一个列表(比如data_list)。如果将wordList设置为data_list,则不会执行任何操作。我的问题是如何将data_list显示为图像中的自动补全


Tags: 命令alpha视图列表data键入deflist
1条回答
网友
1楼 · 发布于 2024-10-01 22:29:14

无需创建列表,因为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()

相关问题 更多 >

    热门问题