代码之家  ›  专栏  ›  技术社区  ›  Tobias Leupold

如何在QComboBox中为QCompleter使用自定义验证函数

  •  0
  • Tobias Leupold  · 技术社区  · 6 年前

    我有一个字符串匹配函数用于搜索比 QString::contains() (例如,当你搜索“mueller”时,它将匹配“Mller”)。

    我想用这个函数在 QComboBox . 默认完成几乎可以满足我的需要:如果我这样做了

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

    然后在 QComboBox公司 的行编辑,弹出窗口,只显示从键入内容开始的条目。

    这是我想要的,但我想 QCompleter 使用我的搜索函数而不是 QString::startsWith() 显然是在这里使用的(并将模式设置为 Qt::MatchContains 更好但仍然不够)。

    有什么方法可以自定义完成者的搜索功能吗?

    谢谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tobias Leupold    6 年前

    我最后用了自己的 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() 或者这样。

    推荐文章