在编辑QTableWidgetItem时捕获ESC按下

时间:2018-03-03 12:49:34

标签: c++ qt qt5 qtablewidget qtablewidgetitem

如果用户编辑QTableWidgetItem并通过按ESC中止该操作,我该如何捕获?我通过捕捉QTableWidget::cellDoubleClicked来处理相应项目的内容,并且通过收听QTableWidget::cellChanged我知道什么时候发生了变化。但是当用户按下ESC时,我不知道。

我尝试在QTableWidget上安装一个事件过滤器,但它只捕获了窗口小部件自己接收的按键 - 编辑器似乎是另一回事。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您必须使用委托并使用eventFilter,以下代码就是一个示例:

#include <QApplication>
#include <QKeyEvent>
#include <QStyledItemDelegate>
#include <QTableWidget>

#include <QDebug>

class TableWidgetDelegate: public QStyledItemDelegate{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
protected:
    bool eventFilter(QObject * object, QEvent * event){
        QWidget *editor = qobject_cast<QWidget*>(object);
        if(editor && event->type() == QEvent::KeyPress) {
            if(static_cast<QKeyEvent *>(event)->key() == Qt::Key_Escape){
                qDebug()<<"escape";
            }
        }
        return QStyledItemDelegate::eventFilter(editor, event);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTableWidget w(6, 4);
    w.setItemDelegate(new TableWidgetDelegate);
    w.show();

    return a.exec();
}