【问题标题】:How to show the row where QPushButton is clicked in QTableWidget如何在 QTableWidget 中显示单击 QPushButton 的行
【发布时间】:2018-03-01 22:48:26
【问题描述】:

我想删除单击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);
        }
    }
}

【问题讨论】:

    标签: c++ qt qt5 qtablewidget qtablewidgetitem


    【解决方案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,这通过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() 方法用于设置焦点,因为最后一个具有它的单元格已被删除。

    完整的例子可以在下面的link找到。

    【讨论】:

      【解决方案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);
           }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2018-12-10
        • 2020-06-15
        • 2014-08-07
        • 2015-05-23
        • 1970-01-01
        相关资源
        最近更新 更多