QTableView行删除

时间:2015-02-21 11:14:11

标签: c++ qt qtableview qpushbutton row-removal

我创建了一个这样的表格视图:

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 个答案:

答案 0 :(得分: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()信号连接到map()的{​​{1}}位置,并使用{{1}添加映射因此,当从按钮发出QSignalMapper信号时,会发出信号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)插槽中的映射,因为单击某个项目后该行将被删除。