如何在 QComboBox 中为 QCompleter 使用自定义验证函数
How to use a custom validation function for a QCompleter in a QComboBox
我有一个字符串匹配函数,用于搜索比 QString::contains()
更高级的名称(例如,当您搜索 "mueller" 时,它将匹配 "Müller")。
我想使用此功能在 QComboBox
中搜索。默认完成几乎可以满足我的需要:如果我这样做
combobox->setEditable(true);
combobox->setInsertPolicy(QComboBox::NoInsert);
combobox->completer()->setCompletionMode(QCompleter::PopupCompletion);
并在 QComboBox
的 lineedit 中键入一些文本,弹出窗口弹出,仅显示已键入内容开始的条目。
这就是我想要的,但我希望 QCompleter
使用我的搜索功能评估匹配项,而不是此处显然使用的 QString::startsWith()
(并将模式设置为 Qt::MatchContains
更好,但仍然不够)。
有什么办法可以自定义完成者的搜索功能吗?
感谢大家的帮助!
我最终使用了自己的 QCompleter
并将其设置为 QComboBox
的 QLineEdit
。完成器不使用组合框的模型,而是使用自己的模型,每次输入的文本更改时都会填充数据。
可按如下方式进行:
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()
来处理从列表和 e 中选择的内容。 G。做一个 QComboBox::setCurrentIndex()
之类的。
我有一个字符串匹配函数,用于搜索比 QString::contains()
更高级的名称(例如,当您搜索 "mueller" 时,它将匹配 "Müller")。
我想使用此功能在 QComboBox
中搜索。默认完成几乎可以满足我的需要:如果我这样做
combobox->setEditable(true);
combobox->setInsertPolicy(QComboBox::NoInsert);
combobox->completer()->setCompletionMode(QCompleter::PopupCompletion);
并在 QComboBox
的 lineedit 中键入一些文本,弹出窗口弹出,仅显示已键入内容开始的条目。
这就是我想要的,但我希望 QCompleter
使用我的搜索功能评估匹配项,而不是此处显然使用的 QString::startsWith()
(并将模式设置为 Qt::MatchContains
更好,但仍然不够)。
有什么办法可以自定义完成者的搜索功能吗?
感谢大家的帮助!
我最终使用了自己的 QCompleter
并将其设置为 QComboBox
的 QLineEdit
。完成器不使用组合框的模型,而是使用自己的模型,每次输入的文本更改时都会填充数据。
可按如下方式进行:
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()
来处理从列表和 e 中选择的内容。 G。做一个 QComboBox::setCurrentIndex()
之类的。