QML Combobox - dynamiczna aktualizacja modelu

QML Combobox - dynamiczna aktualizacja modelu
BartoSAS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
0

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

Kopiuj
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ę:

Kopiuj
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;
}
TomaszLiMoon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 530
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.

BartoSAS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
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ę

Delor
  • Rejestracja: dni
  • Ostatnio: dni
2

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

TomaszLiMoon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 530
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

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

zostanie przerwana.

BartoSAS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
0

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

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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ść.

BartoSAS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 310
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.