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

6 c++ qt qtablewidget qtablewidgetitem qt5

我想删除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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

eyl*_*esc 5

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

*。H

private slots:
    void onClicked();
Run Code Online (Sandbox Code Playgroud)

*.cpp

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

在槽中我们可以通过该sender()方法获取发出信号的按钮,然后我们获取QWidgetparent(以名称pWidget创建),这是添加到的widgetQTableWidget并且它的位置是相对于它的,然后我们使用该方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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