如何在右键单击时删除 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);
}
我正在努力做到这一点,以便您可以右键单击 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);
}