3

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

在此处输入图像描述

我有一个创建按钮来创建新行,如您所见,我为每一行定义了一个按钮,以通过以下代码删除该行:

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());
}

如您所见,我知道女巫按钮发送信号,现在我需要删除该行。这是我的问题:如何在表格视图中获取发件人按钮的行以删除该行?我到处搜索,我没有意识到如何获取项目的行和列。

4

1 回答 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()按钮的信号连接到map()插槽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)都会发出包含行号的映射器信号,并因此button_clicked使用包含行号的参数调用。

同样在这里您应该更新插槽中的映射,button_clicked因为当您单击一个项目时该行被删除。

于 2015-02-21T11:28:27.790 回答