python - 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)
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.
解决方案
由于 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()
推荐阅读
- python - Python如何根据多个变量创建排名?
- visual-studio-code - 为什么 vscode-eslint 使用与 ESLint 不同的“根”?
- reactjs - 如何将这些数据从子组件传递给父组件?
- python - TypeError:“dict”和“dict”排行榜命令错误的实例之间不支持“<”
- swiftui - 在初始化期间确定 NavigationLink 目标
- java - 二叉树搜索非键值
- mysql - 如何在 sql/mysql 中的给定值的多值列上设置 null?
- mysql - MySQL 查询以创建报告
- react-native - 多行文本输入和键盘避免视图
- tomcat - Apache tomcat 多次重新加载上下文