首页 > 解决方案 > 如何捕获 QTableWidget 的编辑单元格的按键事件?

问题描述

这是捕获 QTableWidget 的按键事件的 2 个答案。 如何从键盘为 QTableWidget 创建一个信号?

按照上面的方法,我可以“挂钩”按键事件,当我按下空格时,背景颜色变为红色。

在此处输入图像描述

但是,它仅适用于选定的单元格,而不适用于正在编辑的单元格。

在此处输入图像描述

当它处于编辑状态时,这两种方式都失败了。我可以自由地输入空格。

标签: c++qt

解决方案


当它处于“编辑状态”时,顶部有一个编辑器小部件QTableWidget(项目委托),它接收关键事件,并且由于它在顶部,您无法看到其后面的单元格内容和单元格背景。QAbstractItemDelegate但是您可以通过设置来访问和“挂钩”这些事件QTableWidget

// itemdelegate.h
class ItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit ItemDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent)
    {
        
    }

    bool eventFilter(QObject *object, QEvent *event) override
    {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
            if (keyEvent->key() == Qt::Key_Space) {
                qDebug() << "space pressed";
            }
        }
        return false;
    }

};

// main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    QTableWidget* widget = new QTableWidget();
    widget->setColumnCount(2);
    widget->setRowCount(2);
    widget->setItemDelegate(new ItemDelegate(widget));
    widget->show();

    return a.exec();
}

推荐阅读