Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QTableView行删除_C++_Qt_Qtableview_Qpushbutton_Row Removal - Fatal编程技术网

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