QML Combobox - dynamiczna aktualizacja modelu

0

Witam,
aktualnie próbuję zrobić podpowiedzi w combo-boxie wraz z dynamiczną aktualizacją modelu, mój kod wygląda tak:

ComboBox{
        id: searchbar
        width: (parent.width-20)*0.75
        wheelEnabled: true
        editable: true
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: title.bottom
        anchors.topMargin: 80
        textRole: "name"
        model: dl.data
        
        onCurrentTextChanged: {
            
            console.log(searchbar.currentText);
            
            if(searchbar.find(searchbar.currentText) === -1)
            {               
                if(searchbar.currentText.length)
                {
                    getDb(searchbar.currentText)
                }
            }
            else
            {
                console.log("Wybrany: "+model[currentIndex].name)
            }
            
            element.text = searchbar.currentText;
        }
    }

wiem, że problem był już kiedyś omawiany, ale uznałem, że potrzebuję pomocy.
Na początku, aby model nie był pusty wypełniam go wpisami ze słownika na literę 'a'. Kiedy próbujemy coś wpisać na 'a' ładnie podpowiada wszystkie możliwe rozwiązania, ale gdy chcę wyszukać coś na literę, np. 'b', to niestety nie następuje aktualizacja, a searchbar.currentText do logów nie zwraca ani jednej litery wpisanej w combobox'a.
Czy będę musiał 'ręcznie rzeźbić' coś podobnego do combobox'a, czy może coś jednak przeoczyłem?
Funkcja do zwracania obiektów na daną literę:

QVector<QObject *> DataLoader::getValues(QString key)
{
    QVector<QObject*> result;

    for(auto i = 0; i < _data.size(); i++)
    {
        qDebug() << qobject_cast<Garbage*>(_data[i])->name().at(0);

        if(qobject_cast<Garbage*>(_data[i])->name().at(0) == key.at(0))
        {
            result.append(_data[i]);
        }
        else
        {
            break;
        }
    }

    return result;
}
1

Dla mnie najbardziej podejrzanym jest użycie break, które przerywa pętle i prawdopodobnie uniemożliwia znalezienie odpowiednich pasujących obiektów. Ale bez całości kodu, to jest jak wróżenie z fusów.

0

Zapomniałem dodać, że elementy w vectorze są posortowane alfabetycznie, więc jak trafi na wyraz ze słownika z inną literą na początku, to przerywam szukanie wpisów, bo nie ma więcej rozpoczynających się na daną literę

2

Czyli jak szukasz litery 'b' a trafisz na 'a' to przerywasz pętlę?

1

więc jak trafi na wyraz ze słownika z inną literą na początku, to przerywam szukanie wpisów

Nie bardzo rozumiem. Jeżeli chcesz znaleźć wszystkie obiekty na literę** "B", to gdy masz w _data jakiś obiekt na literę "A"**, to pętla nigdy nie dotrze do tych obiektów, gdyż już przy pierwszym porównaniu

if( qobject_cast<Garbage*>(_data[i])->name().at(0) == key.at(0) )  -> if( "A" == "B" )

zostanie przerwana.

0

Faktycznie :/ To muszę poprawić... Jak wrócę z zakładu, to sprawdzę, czy korekta tego wystarczyła.

1

Z tego co pamiętam model danych trzymany w QVector QML będzie postrzegał jako statyczny.
Jeśli chcesz mieć dynamiczny model danych to potrzebujesz czegoś bardziej zaawansowanego.
W twoim przypadku najbardziej pasuje QStringListModel, który jest nieco bardziej dynamiczny, który można połączyć z QSortFilterProxyModel i tanio osiągnąć wymaganą funkcjonalność.

0

Dzięki wielkie, trochę czasu potrzebowałem, aby to ogarnąć, ale rozwiązane.
Na tym trochę bazowałem, ale dodatkowo zostawiam informację dla potomnych, w dokumentacji jest napisane, że gdy nie znajdzie elementu w comboboxie, wtedy w QML wartość z pola znajduje się pod editText, a nie pod currentText

1 użytkowników online, w tym zalogowanych: 0, gości: 1