Могу ли я настроить поиск в QComboBox? - PullRequest
1 голос
/ 30 января 2012

В нередактируемом QComboBox, если вы быстро нажмете некоторые клавиши, будет выполнен поиск по отображаемым текстам, и будет выбран первый элемент с введенным вами префиксом.Например, если в выпадающем списке есть шесть элементов, «Алабама», «Аляска», «Калифорния», «Колорадо», «Огайо» и «Луизиана», и вы нажмете «C», будет выбрана «Калифорния».Если вы подождете некоторое время и нажмете O, будет выбран «Огайо».Однако, если вы быстро наберете «CO», будет выбран «Колорадо».

Является ли это поведение функцией Qt?По-видимому, это работает повсеместно, несмотря на структуру GUI внизу.Если это обрабатывает Qt, могу ли я его настроить?Что я хочу сделать, это в основном выполнять поиск на основе данных, которые не отображаются в ComboBox.Например, в ComboBox для выбора пользователей, в которых перечислены имена входа, достаточно будет указать фамилию пользователя, чтобы выбрать его.Впрочем, этого было бы достаточно для поиска совпадений в середине текста (например, набрав «nia», чтобы выбрать «Калифорния»).

Сначала QCompleter, казалось, помог, но похоже, чтобыло бы полезно только в редактируемом QComboBox ...

Если это невозможно с QComboBox, какой виджет следует использовать для этого?

Спасибо за внимание.

1 Ответ

1 голос
/ 30 января 2012

Вы подкласс 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;
         }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...