【问题标题】:QTableView row removeQTableView 行删除
【发布时间】:2015-02-21 11:14:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ qt qtableview qpushbutton row-removal


    【解决方案1】:

    解决方法是使用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() 信号连接到QSignalMappermap() 插槽,并使用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 槽中的映射,因为当您单击某个项目时该行会被删除。

    【讨论】:

    • 感谢您的回答,亲爱的 nejat。但我对你的回答有一些问题。使用删除功能后,行将再次排序。并且行索引会改变。但是在您的代码中,按钮的索引是静态的。我说的对吗?
    • 对不起,但我仍然认为对象名称在删除后不会显示该行。如果有一种方法可以在每次删除后使用按钮,那就太好了!但如果我在你的回答中遗漏了什么,请告诉我。
    • @ATN 您应该在每次删除后更新对象名称或映射。我想不出别的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2016-10-13
    • 2018-02-02
    • 2018-06-15
    • 2020-11-21
    • 2021-03-26
    相关资源
    最近更新 更多