Qt C++ - 删除 QTableWidget 中的行

Posted

技术标签:

【中文标题】Qt C++ - 删除 QTableWidget 中的行【英文标题】:Qt C++ - Delete row in QTableWidget 【发布时间】:2017-06-08 10:26:49 【问题描述】:

我是 Qt 新手,我想这样做

void MainWindow::test()

    for (int i = 0 ; i < 5 ; ++i)
    
        ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);
        ui->tableWidget->setItem(i,0, new QTableWidgetItem(QString("1")));
        ui->tableWidget->setItem(i,1, new QTableWidgetItem(QString("1")));
    

    QPushButton *listB = new QPushButton[5];
    QHBoxLayout *listLayout = new QHBoxLayout[5];
    QWidget* listWidget = new QWidget[5];

    for (int i = 0 ; i <  5 ; ++i)
    
        ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);
        listB[i].setText("OK");
        listLayout[i].addWidget(listB + i);
        listWidget[i].setLayout(listLayout + i);
        ui->tableWidget->setCellWidget(i,0,listWidget + i);
        connect(listB + i , &QPushButton::clicked, [=]ui->tableWidget->removeRow(i););
    


我想在 QTableWidget 的每一行中添加一个 QPushButton,当我点击这个按钮时,相应的行会消失。但是,每当我单击按钮时,它都会导致“分段错误”。

请指出我的代码有什么问题以及我的程序的解决方案是什么。 谢谢。

【问题讨论】:

连接到按钮的插槽调用removeRow(i),其中i=0...4。但是,在删除一行后,例如i=0,则第 4 行将无效(索引超出范围),并可能导致分段错误。 【参考方案1】:

问题是由它生成的数组引起的,似乎从数组中删除一个元素会导致索引出现问题。

void MainWindow::test()

    ui->tableWidget->setColumnCount(2);

    for (int i = 0 ; i < 5 ; ++i)
    
        ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);
        ui->tableWidget->setItem(i,0, new QTableWidgetItem(QString("1")));
        ui->tableWidget->setItem(i,1, new QTableWidgetItem(QString("1")));
    


    for (int i = 0 ; i <  5 ; ++i)
    
        QPushButton *listB = new QPushButton;
        QHBoxLayout *listLayout = new QHBoxLayout;
        QWidget* listWidget = new QWidget;
        ui->tableWidget->setRowCount(ui->tableWidget->rowCount() + 1);
        listB->setText("OK");
        listLayout->addWidget(listB);
        listWidget->setLayout(listLayout);
        ui->tableWidget->setCellWidget(i,0,listWidget);
        connect(listB, &QPushButton::clicked, [=]ui->tableWidget->removeRow(i););
    


【讨论】:

以上是关于Qt C++ - 删除 QTableWidget 中的行的主要内容,如果未能解决你的问题,请参考以下文章

Qt 学习笔记 10.QTableWidget

Qt 和 C++:双重继承与组合?

Qt 杂记——QTableWidget列表添加删除(备份)

qt 设计器 QTableWidget 的某些列可编辑

C++,从 QTableWidget 添加/删除行

Qt C++ 在表之间拖动 QHeaderView