我最后用了自己的
QCompleter
并为
QComboBox
的
QLineEdit
. completer不使用组合框的模型,而是使用自己的模型,每当输入的文本更改时,它都会填充数据。
可按如下方式进行:
m_matchingNames = new QStringListModel(this);
m_nameCompleter = new QCompleter(m_matchingNames, this);
m_nameCompleter->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
m_playersSelect->setEditable(true);
m_playersSelect->setInsertPolicy(QComboBox::NoInsert);
m_playersSelect->setCompleter(0);
m_playersSelect->lineEdit()->setCompleter(m_nameCompleter);
connect(m_playersSelect->lineEdit(), &QLineEdit::textEdited, this, &ScorePage::nameSearchChanged);
和
void ScorePage::nameSearchChanged(const QString &text)
{
QStringList possibleNames;
for (const QString &name : m_availableNames) {
if (checkMatch(name, text)) {
possibleNames << name;
}
}
m_matchingNames->setStringList(possibleNames);
}
很可能不是最预先形成的解决方案,但它是有效的:-)
一个也可以连接到
QCompleter::activated()
处理从列表中选择的内容,例如
QComboBox::setCurrentIndex()
或者这样。