我正在尝试这样做,因此您可以右键单击表窗口小部件中的一行并将其删除。我找不到一个可行的例子。任何帮助是极大的赞赏。
这是我更新的代码,可以更好地可视化:
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/