c++ - QTableView 行删除

标签 c++ qt qtableview qpushbutton row-removal

我创建了一个这样的 TableView :

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

如您所见,我知道女巫按钮会发送信号,现在我需要删除该行。 这是我的问题: 如何在 TableView 中获取发件人按钮行以删除该行? 到处找了找也不知道怎么获取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 类,并使用与发送信号的对象相对应的整数、字符串或小部件参数重新发射它们。所以你可以有一个这样的:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(button_clicked(int)));

在表格 View 的每一行中添加按钮时,您可以将按钮的 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 插槽中的映射,因为当您单击某个项目时该行会被删除。

关于c++ - QTableView 行删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645098/

相关文章:

c++ - 派生自 QSettings 并存储 QIcon

python - 如何改变QTableView图像大小

C++ API DLL 项目

c++ - 尝试获取文件 MD5 时 Qt 程序卡住

c++ - 使用 Emscripten 构建静态或共享的 boost 库

c++ - QCommandLineParser 向参数添加功能

python - PyQt:如何确定同时按下哪个鼠标按钮以及哪个 QTableView 的单元格?

c++ - QTableView 如何判断 Row 是否被选中?

c++ - 是否可以在静态编译时从不同的源文件构建一个 vector ?

c++ - 如何创建第一个字节对齐到 16 字节但没有填充的 char/std::byte 的 std::vector?