我正在尝试这样做,因此您可以右键单击表窗口小部件中的一行并将其删除。我找不到一个可行的例子。任何帮助是极大的赞赏。

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

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

最佳答案

当您使用Qt Designer创建 QTableWidget 并设置行和列时,不一定每个网格都具有一个 QTableWidgetItem 关联,因此最好不要使用 currentItem()

因此,应该使用 QTableWidgetItem 方法和事件的位置来使用 QModelIndex ,而不是使用 indexAt()

由于要求是右键单击,因此使用 cellClicked 信号是不正确的。在这种情况下,我将使用 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 ,则在 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);
}

关于c++ - 如何右键单击删除表格行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57212420/

10-11 18:06