Qt table 小部件,删除行的按钮

Qt table widget, button to delete row

我有一个 QTableWidget,对于所有行,我将一列的 setCellWidget 设置为一个按钮。

我想将此按钮连接到删除此行的函数。 我尝试了这段代码,但它不起作用,因为如果我只是单击我的按钮,我不会将当前行设置为按钮所在的行。

ui->tableWidget->insertRow(ui->tableWidget->rowCount());
QPushButton *b = new QPushButton("delete",this);
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount()-1,0,b);
connect(d,SIGNAL(clicked(bool)),this,SLOT(deleteThisLine()));
...


void MainWindow::deleteThisLine()
{
    int row = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(row);
}

如何将我的按钮连接到一个函数,使该函数知道按下了哪个按钮(在哪一行)?

创建自定义 class,在其中传递创建的按钮对象和行索引。从您的自定义按钮 class,处理按钮按下事件并发出从创建自定义按钮的对象处理的自定义信号(它将携带索引号)。下面是一些相关的代码,给你一个提示:

.h

class mypushbutton {
   explicit mypushbutton(QObject *parent = 0, QPushButton *pushbutton = 0, int index = 0);
   signal:
       void deleteRow(int index);
}

.cpp

mypushbutton() {
connect(pushbutton, SIGNAL(clicked(bool)), this, SLOT(actionButtonClick(bool)));
}
actionbuttonclicked() { emit deleteRow(index);}

使用这种连接方式将信号连接到插槽:

connect(ui->btnDelete, &QPushButton::clicked, this,&MainWindow::deleteRow);

并在调用函数时删除例如一行:

void MainWindow::deleteRow()
{
    int row = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(row);
}

要删除行,我们必须先获取行,如果我们在单元格内插入小部件,currentRow() 方法将不会 return 适当的行,在许多情况下它会 return 没有选择小部件的最后一个单元格的行。

出于这个原因,您必须选择另一种解决方案,对于这种情况,我们将使用 QTableWidgetindexAt() 方法,但为此我们需要知道单元格的位置(以像素为单位)。当一个小部件添加到一个单元格时,这个单元格将成为小部件的父级,所以我们可以使用 parent() 方法从按钮访问单元格,然后获取单元格相对于QTableWidget 并在 indexAt() 中使用它。要访问该按钮,我们将使用 sender()

移除当前单元格后焦点丢失,一个可能的解决方案是将焦点重新放在另一个单元格中。

void MainWindow::deleteThisLine()
{
    //sender(): QPushButton
    QWidget *w = qobject_cast<QWidget *>(sender()->parent());
    if(w){
        int row = ui->tableWidget->indexAt(w->pos()).row();
        ui->tableWidget->removeRow(row);
        ui->tableWidget->setCurrentCell(0, 0);
    }
}