C++ QTableView行删除
我创建了如下表视图: 我有一个创建按钮来创建新行,如您所见,我为每一行定义了一个按钮,以通过以下代码删除该行:C++ QTableView行删除,c++,qt,qtableview,qpushbutton,row-removal,C++,Qt,Qtableview,Qpushbutton,Row Removal,我创建了如下表视图: 我有一个创建按钮来创建新行,如您所见,我为每一行定义了一个按钮,以通过以下代码删除该行: int i = 0; QPushButton *viewButton; QStandardItemModel *model; void MainWindow::on_pushButton_clicked() { model->appendRow(new QStandardItem(QString(""))); viewButton = new QPushButt
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());
}
void主窗口::按钮点击()
{
//通过这条线我可以找到信号的发送者
QPushButton*pb=qobject_cast(qobject::sender());
}
正如你们所看到的,我知道开关按钮发送信号,现在我需要删除这一行。
我的问题是:
如何获取表视图中的“发件人行”按钮以删除该行?
我到处搜索,但没有意识到如何获取项目的行和列。解决方法是使用
QObject::setObjectName
并为添加的按钮设置一些名称:
viewButton.setObjectName(QString("%1").arg(i));
在单击的按钮
插槽中,您可以使用对象名称检索行号:
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();
}
在表格视图的每一行中添加按钮时,您可以将按钮的clicked()
信号连接到QSignalMapper
的map()
插槽,并使用setMapping
添加映射,这样当按钮发出clicked()
信号时,就会发出map(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)
信号将发出,其中包含行号,因此单击的按钮将被调用,并使用包含行号的参数
此外,您还应该在单击的按钮槽中更新映射,因为当您单击某个项目时,该行将被删除。感谢您的回答亲爱的nejat。但我对你的回答有些疑问。使用删除功能后,行将再次排序。行索引也会改变。但在代码中,button的索引是静态的。我说的对吗?抱歉,我仍然认为对象名称在删除后不会显示行。如果有一种方法,我可以诉诸按钮后,每次删除这将是伟大的!但如果我在你的答案中遗漏了什么,请告诉我。@ATN每次删除后,你应该更新对象名称或映射。我想不出别的了。
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);