Ily*_*lya 5 c++ qt qtablewidget qtablewidgetitem
现在我可以处理QTableWidget函数中的所有按键eventFilter()(在myTable->viewport()->installEventFilter(this);构造函数中调用之后).
在编辑时,唯一不起作用的地方是可编辑单元格(因为它会抓取所有按键).为了解决这个问题,我无法调用installEventFilter()表中的每个项目,因为这些项目不是QObjects(我也不能connect用于处理按键处理).
我唯一的解决方案是将QLineEdits放在这些单元格中,并使用事件过滤器在编辑时捕获按键.但是,仅使用标准物品可以解决它吗?(即只QTableWidgetItem带一面旗帜Qt::ItemIsEditable)
我也可以打电话grabKeyboard()给我QTableWidget.在这种情况下,我将按下所有按键(即使在用户编辑单元格时),但它会阻止编辑框(即用户无法输入任何内容).可能是在调用grabKeyboard()表后修复损坏的编辑框?
这很容易实现。只需子类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)