如何在可编辑的QTableWidgetItem中捕获按键?

Ily*_*lya 5 c++ qt qtablewidget qtablewidgetitem

现在我可以处理QTableWidget函数中的所有按键eventFilter()(在myTable->viewport()->installEventFilter(this);构造函数中调用之后).

在编辑时,唯一不起作用的地方是可编辑单元格(因为它会抓取所有按键).为了解决这个问题,我无法调用installEventFilter()表中的每个项目,因为这些项目不是QObjects(我也不能connect用于处理按键处理).

我唯一的解决方案是将QLineEdits放在这些单元格中,并使用事件过滤器在编辑时捕获按键.但是,仅使用标准物品可以解决它吗?(即只QTableWidgetItem带一面旗帜Qt::ItemIsEditable)

我也可以打电话grabKeyboard()给我QTableWidget.在这种情况下,我将按下所有按键(即使在用户编辑单元格时),但它会阻止编辑框(即用户无法输入任何内容).可能是在调用grabKeyboard()表后修复损坏的编辑框?

Mar*_*k R 2

这很容易实现。只需子类QStyledItemDelegate重写createEditor方法,如下所示:

QWidget *AlterEditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    QWidget *result = QStyledItemDelegate::createEditor(parent, option, index);
    result->installEventFilter(new YourEventFilter(result));
    return result;
}
Run Code Online (Sandbox Code Playgroud)

而不是替换 QTableWidget 的委托。

或者甚至更好的是,子类化创建接受原始的代理类QAbstractItemDelegate(更多的编写,但更通用,并且可以通过其他修改来组合)。

AlterEditorProxyDelegate::AlterEditorProxyDelegate(QAbstractItemDelegate *original, QObject *parent)
    : QAbstractItemDelegate(parent)
    , original(original)
{}

QWidget *AlterEditorProxyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    QWidget *result = original->createEditor(parent, option, index);
    result->installEventFilter(new YourEventFilter(result));
    return result;
}

// other methods which invokes respective methods for `original` style. 
Run Code Online (Sandbox Code Playgroud)