【问题标题】:How to use a custom validation function for a QCompleter in a QComboBox如何在 QComboBox 中为 QCompleter 使用自定义验证函数
【发布时间】:2018-08-09 11:52:10
【问题描述】:

我有一个字符串匹配函数可用于搜索比QString::contains() 更高级的名称(例如,当您搜索“mueller”时,它将匹配“Müller”)。

我想使用这个函数在QComboBox 中进行搜索。默认完成几乎可以满足我的需要:如果我这样做

combobox->setEditable(true);
combobox->setInsertPolicy(QComboBox::NoInsert);
combobox->completer()->setCompletionMode(QCompleter::PopupCompletion);

然后在QComboBox 的行编辑中输入一些文本,弹出窗口会弹出,只显示已输入的条目。

这就是我想要的,但我希望QCompleter 使用我的搜索功能而不是显然在这里使用的QString::startsWith() 来评估匹配项(并且将模式设置为Qt::MatchContains 更好但仍然不够)。

有没有办法自定义完成者的搜索功能?

感谢大家的帮助!

【问题讨论】:

  • 创建自定义模型并使用QSortProxyModel实现您的搜索
  • 免责声明:未经测试。您不能将QComboBox::setCompleter 与此示例中的自定义完成程序一起使用(doc.qt.io/qt-5/qcompleter.html#basic-usage)吗?看起来您可以使用搜索功能,用所有建议填充 QStringList,然后将其设置为您的 QComboBox
  • 据我了解,如果 QCombobox 中的项目是:{“alpha”、“omega”、“omicron”、“zeta”},并且您在QComboBox 你应该显示“omega”和“omicron”,对吗?
  • 是的,但这可以通过默认实现/行为来实现。我的匹配函数还处理变音符号、德语变音符号等,并且也匹配 e。 G。带有搜索词“doe john”的“John Doe”。因此,我不能使用默认的匹配方式,而需要使用我的自定义函数。
  • @Azeem:可能的建议不是问题,因为所有可能的值都已添加到QComboBox。问题是如何选择与输入字符串匹配的可能值,因为QCompleter 提供的匹配功能不够(实际上,我检查了搜索词和可能完成的多个不同版本)。

标签: c++ qt qt5 qcombobox qcompleter


【解决方案1】:

我最终使用了自己的QCompleter 并将其设置为QComboBoxQLineEdit。完成者不使用组合框的模型,而是使用自己的模型,每次输入的文本更改时都会填充数据。

可以按如下方式进行:

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() 之类的。

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多