如何在QTableWidget中显示单击QPushButton的行

时间:2017-09-20 18:35:23

标签: c++ qt qt5 qtablewidget qtablewidgetitem

我想删除点击QPushButton的行怎么可能我觉得使用老虎机是合理的但是怎么做不知道,如果你有任何想法如何获得一行选中的按钮请分享,谢谢。

这是我的桌子

这是我向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 个答案:

答案 0 :(得分:1)

此任务可以使用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 parent(使用名称pWidget创建),这是添加到QTableWidget及其位置相对于它,然后我们使用方法indexAt()来获取与单元格相关联的QModelIndex,并且通过方法{{3}获得行的信息}}。以上所有内容均按以下方式实施:

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

注意: row()方法用于设置焦点,因为删除了最后一个单元格。

完整示例可在以下setCurrentCell()中找到。

答案 1 :(得分:1)

当您创建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);
     }