c++ - 如何捕获 QTableWidget 的编辑单元格的按键事件?
问题描述
这是捕获 QTableWidget 的按键事件的 2 个答案。 如何从键盘为 QTableWidget 创建一个信号?
按照上面的方法,我可以“挂钩”按键事件,当我按下空格时,背景颜色变为红色。
但是,它仅适用于选定的单元格,而不适用于正在编辑的单元格。
当它处于编辑状态时,这两种方式都失败了。我可以自由地输入空格。
解决方案
当它处于“编辑状态”时,顶部有一个编辑器小部件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();
}
推荐阅读
- c# - 在 MVC 控制器中刷新 PartialView
- python - 资源项目的权限被拒绝 仅在 tpu_cluster_resolver 中的 1 个线程上没有
- opengl - MESA_GL_VERSION_OVERRIDE 不会在带有 nouveau 的 Ubuntu 18.04 中更改版本字符串
- excel - 嵌套的 If 语句在 VBA 中没有返回正确的消息
- sql-server-2016 - SQL Server 复制作业错误:消息:命令文本:SELECT TOP 1 0 FROM [dbo].[tablename] WITH (TABLOCK, HOLDLOCK)
- android - 总是收到错误消息:在重力左侧找不到抽屉视图
- dart - 实现广度优先搜索算法时出现内存不足错误
- ios - 我必须每年使用 Enterprise Licensing 发布一个新的 iOS 版本吗?
- javascript - 功能组件内的状态初始化(无无限循环)
- idris - 在 Idris 中定义组