首页 > 解决方案 > Qt 程序在从向量中删除最后一个对象后崩溃

问题描述

我有一个我正在为我的工作制作的应用程序。它基本上考虑员工及其可用性并制定时间表。除此之外,我还有一个名为“编辑员工”的页面,我可以在其中编辑任何员工的信息。我有一个“删除”按钮,当您按下它时,您会从qlistwidget中获取当前行并删除该元素。一切正常,直到向量中只剩下一个元素。

我尝试过从向量中删除的不同形式。我尝试了 .clear().erase(vec.begin()、vec.end()).erase(vec.begin() + position)等。

我还有一个显示向量内容的for循环,它只显示向量中的 1 个元素,这是正确的。该向量没有空格或任何您认为“已损坏”的内容。

void MainWindow::deleteEmployee(int position)
{
//    employeeList.erase(employeeList.begin() + position);

    if(employeeList.size() == 1)
    {
        // fails only when trying to delete from last index
        employeeList.clear();
    }
    else
    {
        employeeList.erase(employeeList.begin() + position);
    }
}

void MainWindow::on_editEmployeeDelete_pushButton_clicked()
{
    QMessageBox::StandardButton reply;
    reply =
       QMessageBox::question(this, "Delete Employee",
           "Are you sure you want to delete " + 
           employeeList.at(ui->editEmployee_listWidget->currentRow()).getFirstName() +
           " " +
           employeeList.at(ui->editEmployee_listWidget->currentRow()).getLastName() +
           "?",
           QMessageBox::Yes|QMessageBox::No);

    if (reply == QMessageBox::Yes)
    {
        QMessageBox::information(nullptr, "Success",
            employeeList.at(ui->editEmployee_listWidget->currentRow()).getFirstName() +
            " " +
            employeeList.at(ui->editEmployee_listWidget->currentRow()).getLastName() +
            " has been deleted successfully.");

        deleteEmployee(ui->editEmployee_listWidget->currentRow());

        // clears the qlistwidget once again to add all employees left in the vector
        ui->editEmployee_listWidget->blockSignals(true);
        ui->editEmployee_listWidget->clear();
        ui->editEmployee_listWidget->blockSignals(false);

        // adds all the employees names to the qlistwidget
        for(unsigned long long i = 0; i < employeeList.size(); i++)
        {
            ui->editEmployee_listWidget->addItem(employeeList.at(i).getLastName() +
                                                 ", " +
                                                 employeeList.at(i).getFirstName());
        }
    }
}

employeeList是一个employee 类型的向量,它是我创建的一个类。它保存他们的名字、排名等(所有 QString 和整数)。

当您单击qlistwidget时,删除按钮将变为启用状态。当您单击删除按钮时,选定的员工将被删除。这工作得很好,直到你剩下 1 个人,其中它崩溃,说明“程序已意外完成”。我尝试了许多不同形式的删除。没有工作。

非常感谢任何帮助,谢谢!

标签: c++qtvectoreraseqlistwidget

解决方案


推荐阅读