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

时间:2012-01-30 13:53:50

标签: qt search combobox

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

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

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

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

感谢您的关注。

1 个答案:

答案 0 :(得分: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;
         }  
}