QList<T>::at: "index out of range" Problem

Alles rund um die Programmierung mit Qt
Antworten
strige
Beiträge: 36
Registriert: 27. Dezember 2009 19:37

QList<T>::at: "index out of range" Problem

Beitrag von strige »

Tach zusammen,
Leider sehe ich momentan den Wald vor lauter Bäumen nicht. Folgendes Problem:

Ich habe ein ListWidget, dass beim Doppelklick den folgenden Slot aufruft.

Code: Alles auswählen

void inWidget::doubleOnUnBkd(QModelIndex index)
{
    int in = index.row();
    int ret = QMessageBox::question(this,"Bestätigen", QString("Möchten Sie %1 buchen?")
                             .arg(fData->getUnbooked(financeData::INCOME).at(in).title),
                             QMessageBox::Yes, QMessageBox::No);
    if (ret == QMessageBox::Yes)
        fData->changeStatus(in, financeData::INCOME);

}
Wenn man die Messagebox bestätigt wird diese Methode aufgerufen:

Code: Alles auswählen

void financeData::changeStatus(int row, int b)
{
    qDebug() << row;
    payment data;
    if (b == INCOME){
        data = inunbooked.at(row);
        inunbooked.removeAt(row);

        for (int i = 0; i< income.length(); i++){
            if(income.at(i) == data){
                data.checked = true;
                income.replace(i, data);
            }
        }
    }

    emit newEntry();

}
Und nun wird das Signal newEntry() ausgelöst was mich zu folgendem Slot bringt:

Code: Alles auswählen

void financeData::saveData()
{
    QFile file("data.fda");
    if(!file.open(QIODevice::WriteOnly)){
        QMessageBox::warning(NULL,"Fehler beim Schreiben", file.errorString());
        return;
    }
    QDataStream s(&file);
    s << this;
    file.close();

    fillBkdLists();

}
Endlch wird nun die Methode fillBKDLists() aufgerufen die mir einfach die listenaktualisiert und mein Widget updatet:

Code: Alles auswählen

void financeData::fillBkdLists()
{
    inunbooked.clear();
    inbooked.clear();
    outunbooked.clear();
    outbooked.clear();

    for(int i =0; i<income.length(); i++){
        if(income.at(i).checked == false)
            inunbooked << income.at(i);
        if(income.at(i).checked == true)
            inbooked << income.at(i);
    }

    for(int i = 0; i<outcome.length(); i++){
        if(outcome.at(i).checked == false)
            outunbooked << outcome.at(i);
        if(outcome.at(i).checked == true)
            outbooked << outcome.at(i);
    }
    emit requestUpdate();

}
request Update erspar ich euch :), der Slot macht nix weiter als das ListWidget zu aktualisieren.
Nun bekomme ich bei einem Doppelklick, meine MessageBox, und beim Klick auf "Yes" stürzt das Programm mit folgender Fehlermeldung ab:
ASSERT failure in QList<T>::at: "index out of range", file /usr/include/QtCore/qlist.h, line 456
Das Programm ist abgestürzt.
Nach ewig langem Debuggen habe ich endlich herausgefunden das dies von der Methode inWidget::doubleOnUnBkd ausgelöst wird und zwar von:

Code: Alles auswählen

 int ret = QMessageBox::question(this,"Bestätigen", QString("Möchten Sie %1 buchen?")
                             .arg(fData->getUnbooked(financeData::INCOME).at(in).title),
                             QMessageBox::Yes, QMessageBox::No);
Warum? Ich verstehe nicht warum die Zeile der MessageBox zweimal ausgeführt wird. beim ersten Durchlauf, also nach dem Doppelklick funktioniert der Slot und springt richtig zu changeStatus...
Erst nachdem die Funktionen wieder verlassen werden, bekomme ich den Error und Absturz, dabei begreife ich nicht warum er den SLot komplett zweimal aufruft.

Ich hoffe ich konnte mein Problem gut darstellen und freue mich auf Antworten.
Vlg Strige
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QList<T>::at: "index out of range" Problem

Beitrag von franzf »

Hast du vllt. den SLOT 2x connected? Der wird dann nämlich auch 2x aufgerufen.
Frag auch unbedingt ab, ob der index noch gültig ist:

Code: Alles auswählen

if (!index.isValid())
    return;
bevor du dir Daten holst.
Und wenn du eh schon deine eigenen Daten parallel zum QListWidget hältst (besser wäre QListWidgetItem::setData() wie in der Doku beschrieben zu nutzen), warum ersparst du dir dann nicht den ganzen Kummer und schreibst dir ein eigenes Model?
strige
Beiträge: 36
Registriert: 27. Dezember 2009 19:37

Re: QList<T>::at: "index out of range" Problem

Beitrag von strige »

Hallo franzf,
Danke Dir für deine Antwort.
Also leider ist der Slot nicht 2mal connected, die Frage warum der Slot 2 mal aufgerufen wird stell ich mir immer noch. Jedoch konnte ich das Problem nun mit der Überprüfung der Gültigkeit des Index erstmal beheben. Danke.
Ich werde aber wie von Dir vorgeschlagen, versuchen doch ein eigenes Model zu kreieren. Zu deiner Frage warum ich mir den Kummer nicht gleich erspare:
Ich mach mir voher kein Plan wie ich etwas programmiere, sonder Texte gleich drauf los, somit nutze ich dann den für mich leichtesten Weg und erst vor einem Problem kommt dann dieser "aha Moment, so gehts ja garnicht" :). Aber durch dieses Problem lerne ich dann neue Wege kennen, wie z.B das von dir angesprochene Model:)
Danke Dir für deine Antwort.
Vlg
Antworten