【问题标题】:Qt table widget, button to delete rowQt表格小部件,删除行的按钮
【发布时间】:2017-10-09 08:18:57
【问题描述】:

我有一个 QTableWidget 并且对于所有行,我将 setCellWidget 在一列中设置为一个按钮。

我想将此按钮连接到删除该行的函数。 我尝试了这段代码,但它不起作用,因为如果我只是单击我的按钮,我不会将当前行设置为按钮的行。

ui->tableWidget->insertRow(ui->tableWidget->rowCount());
QPushButton *b = new QPushButton("delete",this);
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount()-1,0,b);
connect(d,SIGNAL(clicked(bool)),this,SLOT(deleteThisLine()));
...


void MainWindow::deleteThisLine()
{
    int row = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(row);
}

我怎样才能将我的按钮连接到一个函数,让函数知道哪个按钮(在哪一行)被按下了?

【问题讨论】:

  • 在发出信号时将行号作为参数传递,并在槽中删除接收到的行号。
  • 如果您不将此信号/插槽排队,您可能会遇到问题,因为您将删除行 和按钮,而它仍在处理 clickedsignal按钮。
  • @user7431005 试试这个连接:connect(d, &QPushButton::clicked, this,&MainWindow::deleteThisLine);
  • @user7431005 你试过我的解决方案了吗?

标签: c++ qt qt5 qtablewidget qpushbutton


【解决方案1】:

要删除行,我们必须首先获取行,如果我们在单元格内插入小部件,currentRow() 方法将不会返回适当的行,在许多情况下,它将返回最后一个没有小部件的单元格的行被选中。

因此,您必须选择其他解决方案,对于这种情况,我们将使用QTableWidgetindexAt() 方法,但为此我们需要知道单元格的位置(以像素为单位)。当一个小部件添加到一个单元格时,这个单元格将是小部件的父级,所以我们可以使用parent()方法从按钮访问单元格,然后获取单元格相对于@987654325的位置@ 并在indexAt() 中使用它。要访问该按钮,我们将使用sender()

当当前单元格被移除时,焦点会丢失,一个可能的解决方案是将焦点再次放在另一个单元格中。

void MainWindow::deleteThisLine()
{
    //sender(): QPushButton
    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);
    }
}

【讨论】:

    【解决方案2】:

    使用这种连接方式将信号连接到插槽:

    connect(ui->btnDelete, &QPushButton::clicked, this,&MainWindow::deleteRow);
    

    并删除例如调用函数中的一行:

    void MainWindow::deleteRow()
    {
        int row = ui->tableWidget->currentRow();
        ui->tableWidget->removeRow(row);
    }
    

    【讨论】:

    • 这个也可以写成connect(d, &amp;QPushButton::clicked, [=](){ ui-&gt;tableWidget-&gt;removeRow(ui-&gt;tableWidget-&gt;currentRow()); );他的解决方案是使用currentRow(),但是不返回当前行。要么是因为插入的小部件,要么是在单击按钮时失去焦点。
    【解决方案3】:

    创建一个自定义类,在其中传递创建的按钮对象和行索引。从您的自定义按钮类中,处理按钮按下事件并发出一个自定义信号(它将携带索引号),该信号由创建自定义按钮的对象处理。下面是一些相关代码,给大家一些提示:

    .h

    class mypushbutton {
       explicit mypushbutton(QObject *parent = 0, QPushButton *pushbutton = 0, int index = 0);
       signal:
           void deleteRow(int index);
    }
    

    .cpp

    mypushbutton() {
    connect(pushbutton, SIGNAL(clicked(bool)), this, SLOT(actionButtonClick(bool)));
    }
    actionbuttonclicked() { emit deleteRow(index);}
    

    【讨论】:

    • 不幸的是,您使用的是旧的插槽/信号语法,问题是他如何获得该行,因为他使用 currentRow() 的方法不起作用。
    • 是的,currentRow() 方法行不通,我不明白你关于旧插槽/信号的观点......你的意思是什么? deleteRow(index) 需要从创建对象中捕获,他知道要删除哪一行。
    • 你的语法很好,但是是老办法,不支持很多新功能,比如lamba等wiki.qt.io/New_Signal_Slot_Syntax
    • 哦,我明白了。明白了你的意思,但我一开始就很难处理解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2013-04-17
    • 2018-03-30
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多