QListWidget - użcyie metody clear() powoduje wywalenie się całego programu.

0

Witam, mam taki oto kod:

void MainWindow::on_pushButtonRename_clicked()
{
    if(ui->lineEditNew->text().isEmpty())
    {
        QMessageBox::information(this, "info", "Name is empty!");
        return;
    }
    notes.renameFile(ui->listWidgetNotes->currentItem()->text(), ui->lineEditNew->text());
    this->setWindowTitle(ui->lineEditNew->text()+" - VfNotes 1.0");
    ui->lineEditNew->clear();
    ui->listWidgetNotes->clear();
    ui->listWidgetNotes->addItems(notes.getFilesList());
}

Użycie w nim metody clear na listWidgetNotes powoduje zakończenie programu z kodem 0xc0000005. Stało się to, gdy te same instrukcje z jednego slotu QListWidget przeniosłem do innego slotu dla QListWidget oraz, gdy musiałem kod ze slotu lekko zmodyfikować. Kod poprzedniego slotu, na którym wszystko dobrze działało:

void MainWindow::on_listWidgetNotes_clicked(const QModelIndex &index)
{
    ui->plainTextEditContent->setEnabled(true);
    change = false;
    if(isModified)
    {
        auto reply = QMessageBox::question(this, "Test", "Do you want save changes?", QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
        if (reply == QMessageBox::Yes) on_pushButtonSave_clicked();
        else if(reply == QMessageBox::No) notes.closeFile();
        else
        {
            ui->listWidgetNotes->setCurrentIndex(lastIndex);
            return;
        }
    }
    isModified = false;
    this->setWindowTitle(index.data().toString()+" - VfNotes 1.0");
    ui->plainTextEditContent->setPlainText(notes.openFile(index.data().toString()));
    lastIndex = index;
}

Kod slotu, w którym się to wszystko psuje:

void MainWindow::on_listWidgetNotes_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    ui->plainTextEditContent->setEnabled(true);
    change = false;
    if(isModified)
    {
        auto reply = QMessageBox::question(this, "Test", "Do you want save changes?", QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
        if (reply == QMessageBox::Yes) on_pushButtonSave_clicked();
        else if(reply == QMessageBox::No) notes.closeFile();
        else
        {
            ui->listWidgetNotes->setCurrentItem(previous);
            return;
        }
    }
    isModified = false;
    this->setWindowTitle(current->text()+" - VfNotes 1.0");
    ui->plainTextEditContent->setPlainText(notes.openFile(current->text()));
}
0

Nie używaj wskaźnika current gdy jest NULLem.

0

@git: Ale kiedy ten wskaźnik jest NULLem?

1

Np. wtedy, kiedy wyczyszczony zostanie selectionModel listWidgeta. Gdy czyścisz listWidgeta, najpierw czyszczony jest jego selectionModel. W wyniku tego listWidget emituje sygnał currentItemChanged i current w tej sytuacji jest = NULL. Następnie usuwane są dane z modelu listWidgeta itd... albo jakoś tak...
Z resztą, najważniejsze jest, żeby zawsze sprawdzać wskaźnik, który funkcja dostaje jako argument i nigdy nie zakładać, że na coś wskazuje.

0

@git: Dzięki, pomogło :) Mam tylko jeszcze problem z tym, że ui->listWidgetNotes->setCurrentItem(previous); powoduje ciągłe wywoływanie metody void MainWindow::on_listWidgetNotes_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) i tym samym ciągłe pokazywania okna dialogowego, gdy chce się kilknąć krzyżyk lub cancel. Użyłem blokowania i odblokowywania sygnałów, ale to sprawiło, że focus w widgecie nie chciał wrócić na poprzedni obiekt.

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