Segmentation fault bei currentItemChanged (QTableWidget)
-
Servus,
habe ein Problem: und zwar lese ich beim Start meiner Anwendung Daten aus einer Datenbank aus und trage diese in eine Tabelle (QTableWidget). Nun habe ich den Slot currentItemChanged gefüllt, weil ich diesen zum Ändern der Daten benötige. Die Methode sieht wie folgt aus:
void MainWindow::on_tblPersons_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) { if(this->tableFilled && current->text() != previous->text() && current->column() > 0 && current->column() < 5){ QString id = this->ui->tblPersons->item(current->row(), 0)->text(); QString firstname = this->ui->tblPersons->item(current->row(), 1)->text(); QString lastname = this->ui->tblPersons->item(current->row(), 2)->text(); QDate birthday = QDate::fromString(this->ui->tblPersons->item(current->row(), 3)->text(), Qt::ISODate); QString email = this->ui->tblPersons->item(current->row(), 4)->text(); QRegExp regExpNames("^[a-zA-Z]*$"); QRegExp regExpEmail("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"); if(regExpNames.exactMatch(firstname) && regExpNames.exactMatch(lastname) && regExpEmail.exactMatch(email) && birthday.isValid()){ // Ändern in der Datenbank QString sql = "UPDATE pgperson SET pfirstname='" + firstname + "', "; sql += "plastname='" + lastname + "', pemail='" + email + "', "; sql += "pbirthday='" + birthday.toString(Qt::ISODate) + "' WHERE pid = '" + id + "'"; QSqlQuery query = this->db->query(sql); if(query.lastError().isValid()){ this->outputWarning("Beim Bearbeiten ist ein Fehler aufgetreten.", "Fehler beim Bearbeiten"); } // Ändern der Person int countPerson = this->pl->countPerson(); for(int i = 0; i < countPerson; i++){ if(this->pl->getPerson(i)->getId() == id.toInt()){ Person *person = this->pl->getPerson(i); person->setFirstname(firstname); person->setLastname(lastname); person->setBirthday(birthday); person->setEmail(email); this->fillPersonTable(); } } } else{ this->outputWarning("Bitte überprüfen Sie Ihre Eingaben.", "Fehler beim Bearbeiten"); } } else{ current = previous; } }
Nun erhalte ich bei Programmstart aber eine Segmentation fault. Ich denke ich weiß warum. Beim Füllen der Tabelle wird der Slot ja ebenfalls aufgerufen, aber da es keinen alten Eintrag gibt, zeigt mir previous auf kein Objekt. Im Debugger erhalte ich den Fehler schon bei der If-Anweisung (vermutlich weil er auf den Text von previous zugreifen möchte).
Es muss definitiv an der Methode liegen, denn wenn ich diese komplett leere, erhalte ich keinen Fehler mehr. Als Lösungsansatz habe ich eine bool-Variable (tableFilled) angelegt, die immer auf false steht, wenn Daten aus der Datenbank in die Tabelle eingetragen werden, allerdings erhalte ich den Fehler noch immer.
Ich hoffe ihr könnt mir weiterhelfen.
Gruß
Kk51
-
Habe nun auf == NULL abgefragt und es funktioniert, ABER dummerweise ist das nicht der Slot, den ich brauche. Welchen Slot verwende ich, wenn ich über die Editierfunktion des Widgets den Text eines Feldes ändere? Dieser Slot wäre optimal gewesen, weil ich auch prüfen kann, welcher Text vorher drinstand.