我无法扩大QTableView
的默认编辑行为。当按Enter键时,我需要以下行为:无法获取`QModelIndex`的QWidget *编辑器
- 如果尚未编辑当前单元格,请开始编辑它。
- 如果正在编辑单元格,
- 2a。提交数据并关闭编辑器。然后,
- 2b。使下面的单元格(如果存在)显示当前单元格。
2a是默认行为,和2b可以有可能通过在重执行的QItemDelegate::eventFilter()
使用QAbstractItemView::setCurrentIndex()
(如建议用类似的上下文here)来实现。
问题是在实现1.我列出下面直到现在我试过的方法。
- 重新配置“平台编辑键”默认情况下,“当平台编辑键被按下了某个项目开始编辑。” (
QAbstractItemView::EditKeyPressed
)在我的平台(Ubuntu 12.04)上,此密钥为F2。我可以将平台编辑键重新配置为Enter,但是- 改变平台默认值似乎是一个坏主意。
- 我找不出如何去做。
捕捉回车按键我用
QShortCut
要做到这一点,如下所示:class CourseTable : public QTableView { /* ... */ }; /* ... */ CourseTable::CourseTable(/* ... */) { /* ... */ QShortcut* shortcut = new QShortcut(QKeySequence(Qt::Key_Return), this); connect(shortcut, SIGNAL(activated()), this, SLOT(handleEnter_())); /* ... */ } /* ... */ void CourseTable::handleEnter_() { QModelIndex idx = this->currentIndex(); if (this->state() != QAbstractItemView::EditingState) this->edit(idx); /* else // see below */ }
这并捕获输入按键,并完成1(上面),但现在2被打破。所以,我需要查看上面
CourseTable::handleEnter_()
中的else
子句,可能在其中调用QAbstractItemView::commitData()
和QAbstractItemView::closeEditor
。问题是这两个函数都需要一个QWidget *editor
的参数,我只是无法弄清楚如何得到。我可以子类QAbstractItemDelegate
,向派生类添加getEditor()
方法,并修改现有代码以将派生委托类的实例传递给CourseTable::setItemDelegate*()
函数。但是这听起来像是太多的工作。
那么,任何想法如何我可以干净地完成1和2而不必重写我的代码?
那么,'QWidget的* QItemDelegate :: createEditor()'原来是一个'const'功能,所以我不能一个指针,即使保存在创建编辑器成员变量。 – wsaleem