如何在右键单击时删除 table 行

how to delete table row on right click

我正在努力做到这一点,以便您可以右键单击 table 小部件中的一行并将其删除。我找不到这方面的工作示例。非常感谢任何帮助。

这是我更新的代码,可以更好地可视化:

bool MainWindow::eventFilter(QObject *obj, QEvent *event) {
    if (obj == ui->tableWidgetOther->viewport() ) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->button() == Qt::RightButton) {
            QTableWidgetItem *cell = ui->tableWidgetOther->currentItem();
            int row = cell->row();
            ui->tableWidgetOther->removeRow(row);
        }
    }
}

由于您要检测右键单击,一种方法是在 QTableWidget 的视口上安装事件过滤器:

ui->tableWidget->viewport()->installEventFilter(this)

您可以在主窗口的构造函数中执行此操作。

此事件过滤器允许我们查看 table 上是否发生了 mousePressEvent,然后我们可以从中检索行。这意味着我们需要一个 eventFilter 方法来处理我们的 mousePressEvent 并确保它在我们的 tableWidget:

mainWindow::eventFilter(QObject *obj, QEvent *event) { 
    if (obj == ui->tableWidget->viewport() ) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event)
        if (mouseEvent->button() == Qt::RightButton) {
            QTableWidgetItem *cell = ui->TableWidget->currentItem();
            int row = cell->row()
            ui->tableWidget->removeRow(row)
        }
    }
    return QMainWindow::eventFilter(obj, event);
}

让我们知道这是否有效!

您可以使用 cellClicked(int, int) 信号并将其连接到将删除该行的插槽。例如:

void MainWindow::deleteRow(int row, int column)
{
    removeRow(row);
    Q_UNUSED(column)
}

connect(ui->tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(deleteRow(int, int)));

编辑:

使用新的连接语法,它看起来像这样:

connect(ui->tableWidget, &QTableWidget::cellClicked, this, &MainWindow::deleteRow);

希望对您有所帮助。

首先,warning/error "Control reaches end of non void function" 被提出是因为你没有 return 任何东西,而 eventFilter() 应该 return a bool.

其次,为什么不直接使用mousePressEvent() or mouseReleaseEvent()

我认为您应该重写 tableWidgetOther 对象的这些方法之一,然后从这里执行删除任务。

它可能看起来像:

void TableWidgetOther::mousePressEvent(QMouseEvent * event)
{
    if(event->buttons() == Qt::RightButton)
    {
        // TODO: remove the current cell (or do whatever you want).
    }
}

我在这里假设您的 tableWidgetOther 对象是 TableWidgetOther class 的一个实例,它继承了 QTableWidget(仅用于示例)。

如果你想处理鼠标事件,我认为这是最简单的解决方案(仅我的意见)。

希望对你有所帮助

当您创建 QTableWidget with Qt Designer and set the rows and columns not necessarily every grid has a QTableWidgetItem associated so it is not best to use currentItem().

所以不用 QTableWidgetItem you should use a QModelIndex using the indexAt() 方法和事件的位置。

由于要求是右键所以使用cellClicked signal. In this case I will use an eventFilter()是不正确的。

ui->tableWidget->viewport()->installEventFilter(this);
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { 
    if (obj == ui->tableWidget->viewport() and 
        event->type() == QEvent::MouseButtonPress) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
        if (mouseEvent->button() == Qt::RightButton) {
            QModelIndex ix = ui->tableWidget->indexAt(mouseEvent->pos());
            if(ix.isValid())
                ui->tableWidget->removeRow(ix.row());
        }
    }
    return QMainWindow::eventFilter(obj, event);
}

如果您想构建自己的 QTableWidget then the same logic is implemented in the mousePressEvent() 方法:

void TableWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons() == Qt::RightButton){
        QPoint p = viewport()->mapFromGlobal(mapToGlobal(event->pos()));
        QModelIndex ix = indexAt(p);
        if(ix.isValid())
            removeRow(ix.row());
    }
    QTableWidget::mousePressEvent(event);
}