我有一个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);
}
如何将我的按钮连接到函数,使函数知道按下了哪个按钮(在哪一行)?
要删除该行,我们必须首先获取该行,如果我们在单元格内插入小部件,currentRow()
方法将不会返回相应的行,在许多情况下,它将返回最后一个单元格的行,而没有已选择的小部件。
出于这个原因,您必须选择另一种解决方案,在这种情况下,我们将使用 indexAt()
方法 QTableWidget
,但为此我们需要知道单元格的像素位置。 当一个人将一个小部件添加到单元格时,这个单元格将是小部件的父级,因此我们可以使用 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);
}
}
使用以下连接方式将信号连接到插槽:
connect(ui->btnDelete, &QPushButton::clicked, this,&MainWindow::deleteRow);
并删除例如调用函数中的行:
void MainWindow::deleteRow()
{
int row = ui->tableWidget->currentRow();
ui->tableWidget->removeRow(row);
}
创建自定义类,在其中传递创建的按钮对象和行索引。在自定义按钮类中,处理按钮按下事件并发出从创建自定义按钮的对象处理的自定义信号(它将携带索引号)。下面是一些相关的代码,给你一个提示:
.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);}