QML Combobox - dynamiczna aktualizacja modelu

QML Combobox - dynamiczna aktualizacja modelu
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
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;
}
AL
copy_if nie dałoby tu rady zamiast na piechotę to robić?
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 8 godzin
  • 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:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
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:ponad 6 lat
  • Ostatnio:około 2 lata
2

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

TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 8 godzin
  • 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:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
0

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

KamilAdam
Przedwczesna optymalizacja jest źródłem wszelkiego zła. – Donald Knuth.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:3 minuty
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ść.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
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.