QTableView删除行

4
我创建了一个表格视图,如下图所示:

enter image description here

我有一个创建按钮来创建新行,正如您所看到的,我为每一行定义了一个删除按钮,使用以下代码删除该行:
int i = 0;
QPushButton *viewButton;
QStandardItemModel *model;
void MainWindow::on_pushButton_clicked()
{
    model->appendRow(new QStandardItem(QString("")));
    viewButton = new QPushButton();
    viewButton->setText("Delete " + QString::number(i));
    ui->tableView->setIndexWidget(model->index(i , 7), viewButton);
    connect(viewButton , SIGNAL(clicked()) , this , SLOT(button_clicked()));
    i++;
}

我为每个点击删除行的按钮创建了一个插槽:

void MainWindow::button_clicked()
{
//   by this line I can get the sender of signal
    QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());
}

从上面的代码中可以看到,我知道哪个按钮发送了信号,现在我需要删除那一行。 我的问题是: 如何获取表格视图中发送方按钮所在的行以便删除该行? 我已经在各处搜索过,但仍不知道如何获取元素的行和列。

1个回答

2
一个解决方法是使用 QObject::setObjectName 并为您添加的按钮设置一些名称:
viewButton.setObjectName(QString("%1").arg(i));

button_clicked 槽中,您可以使用对象名称检索行号:
void MainWindow::button_clicked()
{
//   by this line I can get the sender of signal
    QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());

    int row = pb->objectName().toInt();
}

请注意,在删除行后,您应更新对象名称。
另一种方法是使用QSignalMapper类,该类收集一组无参数信号,并使用与发送信号的对象相对应的整数、字符串或小部件参数重新发出它们。因此,您可以使用以下代码之一:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(button_clicked(int)));

在每行表格视图中添加按钮时,您可以将按钮的clicked()信号连接到QSignalMappermap()槽,并使用setMapping添加映射,以便当来自按钮的clicked()被发出时,会发出mapped(int)信号:

viewButton = new QPushButton();
viewButton->setText("Delete " + QString::number(i));
ui->tableView->setIndexWidget(model->index(i , 7), viewButton);

QObject::connect(viewButton, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, i);

每当您点击行中的按钮时,映射器的mapped(int)信号会发出,其中包含行号,因此将调用带有包含行号的参数的button_clicked函数。同样,在单击项目时,应在button_clicked槽中更新映射,因为该行将被删除。请保留HTML标签。

谢谢您的回答,亲爱的Nejat。但是我对您的答案有一些疑问。使用remove函数后,行将重新排序,并且行索引也会更改。但是在您的代码中,按钮的索引有点静态。我的理解正确吗? - HMD
抱歉,但我仍然认为对象名称在删除某些内容后不显示行。如果有一种方法可以在每次删除后重新排序按钮,那就太好了!但是,如果我在您的回答中错过了什么,请告诉我。 - HMD
@ATN 在每次删除后,您应该更新对象名称或映射。我想不出其他的了。 - Nejat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接