首页 文章

我可以在QComboBox中自定义搜索吗?

提问于
浏览
1

在不可编辑的QComboBox中,如果您快速按某些键,将在显示的文本中执行搜索,并且将选择具有您键入的前缀的第一个项目 . 例如,如果组合框中有六个项目,“Alabama”,“Alaska”,“California”,“Colorado”,“Ohio”和“Louisiana”,并且按C,则会选择“California” . 如果等待一段时间并按O,将选择“俄亥俄州” . 但是,如果您快速键入“CO”,将选择“Colorado” .

这种行为是Qt的功能吗?显然,尽管下面是GUI框架,但它仍然普遍适用 . 如果它是Qt处理这个,我可以自定义吗?我想要做的基本上是基于ComboBox中未显示的数据执行搜索 . 例如,在用于选择列出登录名的用户的ComboBox中,只需键入用户的姓氏即可选择它 . 但是,在文本中间搜索匹配就足够了(例如,输入“nia”来选择“California”) .

起初,QCompleter似乎有所帮助,但看起来它只适用于可编辑的QComboBox ......

如果使用QComboBox无法做到这一点,应该使用哪个小部件来实现这一目标?

感谢您的关注 .

1 回答

  • 1

    您继承 QComboBox 并重新实现keyPressEvent . 假设您在组合框中实现了一个函数,该函数添加了一个带有两个参数的条目:登录名和实际名称:

    void MyComboBox::addEntry(QString loginName, QString name)
    {
        addItem(loginName);
        // Store the name in a member variable, eg a map between names and login names
        namesMap.insert(name, loginName);
    }
    
    void MyComboBox::keyPressEvent(QKeyEvent *evt)
    {
        QString currentString = ebt->text();
        if (currentString.isEmpty())
        {
            QComboBox::keyPressEvent(evt);
            return; 
        } 
    
        // Iterate through the map and search for the given name
        QMapIterator<QString, QString> it(namesMap);
        while(it.hasNext())
        {
             it.next();
             QString name = it.key();
             if (name.contains(currentString))
             {
                 // it.value() is the login name corresponding to the name
                 // we have to find its index in the combo box in order to select it 
                 int itemIndex = findText(it.value());
                 if (itemIndex >= 0)
                     setCurrentIndex(itemIndex);
                 return;
             }  
    }
    

相关问题