如何在QTableWidget中显示QPushButton所在的行

5

我希望能够在QPushButton被点击时删除相应的行,我认为使用slots是合理的,但如何做到我不知道,如果您有任何想法,请分享一下,谢谢。

这是我的表格:

这是我向QTableWidget添加行的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    for(int i = 0; i<20;i++)
        ui->tableWidget->insertRow(ui->tableWidget->rowCount());
    QVector<QString>vec;
    vec<<"first"<<"sec"<<"third"<<"for"<<"fif"<<"first"<<"sec"
      <<"third"<<"for"<<"fif";
    vec<<"first"<<"sec"<<"third"<<"for"<<"fif"<<"first"<<"sec"
      <<"third"<<"for"<<"fif";
    for(int i = 0; i<ui->tableWidget->rowCount();i++)
    {
        for(int j = 0; j<ui->tableWidget->columnCount();j++)
        {
            if(j == 0)
            {
                QWidget* pWidget = new QWidget();
                QPushButton* btn_edit = new QPushButton();
                btn_edit->setText("Remove");
                QHBoxLayout* pLayout = new QHBoxLayout(pWidget);
                pLayout->addWidget(btn_edit);
                pLayout->setAlignment(Qt::AlignCenter);
                pLayout->setContentsMargins(0, 0, 0, 0);
                pWidget->setLayout(pLayout);
                ui->tableWidget->setCellWidget(i, j, pWidget);
                continue;

            }
            QTableWidgetItem*item = new QTableWidgetItem(vec[i]);
            item->setFlags(item->flags() ^ Qt::ItemIsEditable);
            ui->tableWidget->setItem(i, j, item);
        }
    }
}
2个回答

4

这个任务可以使用removeRow()方法解决,但在此之前我们必须获取行数。首先,我们将如下所示将所有按钮连接到循环内的槽:

*.h

private slots:
    void onClicked();

*.cpp

[...]
QPushButton* btn_edit = new QPushButton();
btn_edit->setText("Remove");
connect(btn_edit, &QPushButton::clicked, this, &MainWindow::onClicked);
[...]

在插槽中,我们可以通过 sender() 方法获取发出信号的按钮,然后获取 QWidget 父部件(使用名称 pWidget 创建),这是添加到 QTableWidget 中的部件,并且其位置相对于它。接下来,我们使用方法 indexAt() 获取与单元格相关联的 QModelIndex,并通过方法 row() 获取该行的信息。以上所有操作实现在以下代码中:
void MainWindow::onClicked()
{
    QWidget *w = qobject_cast<QWidget *>(sender()->parent());
    if(w){
        int row = ui->tableWidget->indexAt(w->pos()).row();
        ui->tableWidget->removeRow(row);
        ui->tableWidget->setCurrentCell(0, 0);
    }
}

注意:由于上一个拥有焦点的单元格已经被删除,因此setCurrentCell()方法用于设置焦点。

完整的示例可以在以下链接中找到。


2
当您创建QPushButton时,只需添加以下内容:
    btn_delete = new QPushButton("Remove", ui->tableWidget);
    btn_delete->setObjectName(QString("%1").arg(ui->tableWidget->rowCount()));

    connect(btn_delete, SIGNAL(clicked()), this,    SLOT(CellButtonDeleteClicked()));

创建函数 CellButtonDeleteClicked()

     void CellButtonDeleteClicked()
     {

      //   by this line I can get the sender of signal
      QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());

      int row = pb->objectName().toInt();
      ui->tableWidget->removeRow(row);
     }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接