QTableWidget 在删除多行时崩溃

Posted

技术标签:

【中文标题】QTableWidget 在删除多行时崩溃【英文标题】:QTableWidget crashes on removal of multiple rows 【发布时间】:2013-03-02 19:53:08 【问题描述】:

我想从 QTableWidget 中删除多行(三列),这是我的代码:

void on_del_clicked()

    QList<QTableWidgetItem *> items = ui->tableWidget->selectedItems();
    for(int i = 0;i<items.length(); i=i+3)
    
        int row = items[i]->row();
        if(row>=0)
        
            ui->tableWidget->removeRow(row);
            ui->tableWidget->setCurrentIndex(ui->tableWidget->model()->index(row,0));
        
    

如果我使用 Ctrl 选择多行,它工作正常,但如果我通过拖动鼠标选择多个条目,它会崩溃。仅当所选项目是 3 的倍数并且通过拖动鼠标选择行时才会崩溃。我使用 Qt 4.8.4,我的操作系统是 Ubuntu 12.10 64 位

【问题讨论】:

可能是因为您在同一行中选择了多个项目,然后当您删除行并尝试访问该行中的下一个元素(实际上不存在)时,您遇到了内存泄漏。 @Blood ~> 我在回答中引用了你的评论:D 谢谢你。 @adnan kamili - 不客气 :) @Blood ~> 是我:| 相关:How to remove multiple rows from QTable Widget? 【参考方案1】:

血是对的:

可能是因为您在同一行中选择了多个项目,然后 当您删除行并尝试访问该行中的下一个元素时。

所以改用这段代码:

QList<QTableWidgetItem*> selected_rows = ui->tableWidget->selectedItems();
while( !selected_rows.isEmpty() )

    QTableWidgetItem *itm = selected_rows.at(0);
    ui->tableWidget->removeRow(itm->row());
    selected_rows = ui->tableWidget->selectedItems();

【讨论】:

我最后也想出了相同的代码,但我认为QtableWidget有一个错误,查看这个链接(最后回复):qt-project.org/forums/viewthread/25341 哦,是的,它一定是一个错误!我不知道。【参考方案2】:

只需在 debig 模式下运行,看看你的程序在哪里失败。 例如,在您的循环之前,您可以检查items 是否不是空列表,等等(您可以在循环之前检查qDebug() &lt;&lt; list;)。

还有一个建议,最好使用items.at(i) insted of items[i]

【讨论】:

以上是关于QTableWidget 在删除多行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTableWidget 中选择多行?

如何修复 QTableWidget setText/setCellWidget 在加载 QSettings 时导致崩溃

Qt 添加表格小部件项目的问题

QTableWidget - 将多行文本放在一行中

pyqt Qtablewidget 获取选中多行的行号或者内容

如何在 QTableWidget 中有垂直网格线?