QTableView 行删除
QTableView row remove
我创建了一个 table 视图,如下所示:
我有一个用于创建新行的创建按钮,如您所见,我为每一行定义了一个按钮,用于通过以下代码删除该行:
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());
}
如您所见,我知道 按钮发送信号,现在我需要删除该行。
这是我的问题:
如何在 table 视图中获取发件人按钮行以删除该行?
到处找了找也没有弄明白怎么获取item的行列。
解决方法是使用 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
class 收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发射它们。所以你可以有一个这样的:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(button_clicked(int)));
在 table 视图的每一行中添加按钮时,您可以将按钮的 clicked()
信号连接到 QSignalMapper
的 map()
插槽并添加一个使用 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
插槽中的映射,因为当您单击某个项目时该行会被删除。
我创建了一个 table 视图,如下所示:
我有一个用于创建新行的创建按钮,如您所见,我为每一行定义了一个按钮,用于通过以下代码删除该行:
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());
}
如您所见,我知道 按钮发送信号,现在我需要删除该行。 这是我的问题: 如何在 table 视图中获取发件人按钮行以删除该行? 到处找了找也没有弄明白怎么获取item的行列。
解决方法是使用 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
class 收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发射它们。所以你可以有一个这样的:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(button_clicked(int)));
在 table 视图的每一行中添加按钮时,您可以将按钮的 clicked()
信号连接到 QSignalMapper
的 map()
插槽并添加一个使用 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
插槽中的映射,因为当您单击某个项目时该行会被删除。