SQLite3数据库数据接入PyQt QCompleter/QStringListModel无自动补全
Hey there! Let's troubleshoot why your QCompleter isn't working even though you're successfully pulling the list from SQLite. I've hit this exact snag before, so here are the most common fixes to check step by step:
The most frequent culprit is forgetting to actually attach the completer to your QLineEdit. Even if your model has the right data, if you skip this step, the autocomplete won't kick in at all.
Make sure you have this line in your code:
# After setting up your model and completer your_line_edit.setCompleter(your_completer)
Full quick example for context:
# Fetch data from SQLite title_list = your_sql_fetch_function() # Initialize model and completer model = QStringListModel() model.setStringList(title_list) completer = QCompleter(model) # Critical step: Bind to QLineEdit your_line_edit.setCompleter(completer)
Even if you can print the list, hidden whitespace, newlines, or empty strings might break matching. For example, if your SQLite query returns a title like " Sample Title\n", the completer won't match when the user types "Sample".
Add a quick cleanup step before passing the list to the model:
cleaned_titles = [title.strip() for title in title_list if title.strip()] model.setStringList(cleaned_titles)
By default, QCompleter uses QCompleter.StartsWith (only matches strings that start with the user's input). If you expect partial matches anywhere in the string, tweak the filter mode:
from PyQt5.QtCore import Qt completer.setFilterMode(Qt.MatchContains) # Optional: Make matching case-insensitive completer.setCaseSensitivity(Qt.CaseInsensitive)
If your model or completer are created inside a local function, they might get garbage-collected once the function finishes running—killing the autocomplete functionality silently.
Instead, declare them as class member variables (assuming you're using a class-based UI):
class YourWindow(QMainWindow): def __init__(self): super().__init__() # Initialize UI elements first self.line_edit = QLineEdit(self) # Create model and completer as class members self.title_model = QStringListModel() self.title_completer = QCompleter(self.title_model) self.line_edit.setCompleter(self.title_completer) # Load data from SQLite self.load_sql_titles() def load_sql_titles(self): title_list = your_sql_fetch_function() cleaned_titles = [t.strip() for t in title_list if t.strip()] self.title_model.setStringList(cleaned_titles)
After calling setStringList(), double-check that the model actually contains your data. Add this debug line:
print(self.title_model.stringList())
Compare this output to the list you printed earlier—if they don't match, there's an issue with how you're passing the data to the model.
If none of these fix the problem, feel free to share the exact code snippets for your SQLite fetching and completer setup. That'll help narrow down the issue faster!
内容的提问来源于stack exchange,提问作者Notmeomg

