我正在尝试这样做,以便您可以右键单击表格小部件中的一行并将其删除。我无法找到这方面的有效示例。非常感谢任何帮助。
这是我更新的代码,以更好地可视化:
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
时使用 Qt Designer 并设置行和列不一定每个网格都有 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/