【发布时间】:2012-09-15 14:09:57
【问题描述】:
我无法增强QTableView 的默认编辑行为。当按下 Enter 键时,我想要以下行为:
- 如果当前单元格尚未被编辑,则开始编辑它。
- 如果正在编辑单元格,
- 2a。提交数据并关闭编辑器。那么,
- 2b。将下面的单元格(如果存在)设为当前单元格。
2a 是默认行为,而 2b 很可能通过在 QItemDelegate::eventFilter() 的重新实现中使用 QAbstractItemView::setCurrentIndex() 来实现(如在类似上下文中建议的 here)。
问题在于实现1。我在下面列出了我到目前为止尝试过的方法。
-
重新配置“平台编辑键” 默认情况下,“当平台编辑键在项目上按下时开始编辑。” (
QAbstractItemView::EditKeyPressed) 这个键在我的平台(Ubuntu 12.04)上是 F2。我可以将平台编辑键重新配置为 Enter 但是- 更改平台默认设置似乎是个坏主意。
- 我不知道该怎么做。
-
捕获 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 */ }这确实捕获了 Enter 按键并完成了 1(从上方),但现在 2 已损坏。所以,我需要查看上面
CourseTable::handleEnter_()中的else子句,可能在其中调用QAbstractItemView::commitData()和QAbstractItemView::closeEditor。问题是这两个函数都需要一个QWidget *editor参数,我只是不知道如何获得。我可以继承QAbstractItemDelegate,将getEditor()方法添加到派生类,并修改现有代码以将派生委托类的实例传递给CourseTable::setItemDelegate*()函数。但这听起来工作量太大。
那么,我有什么想法可以干净地完成 1 和 2 而无需重写我的代码?
【问题讨论】:
-
那么,
QWidget* QItemDelegate::createEditor()原来是一个const函数,所以我什至无法将指向创建的编辑器的指针保存在成员变量中。
标签: qt qt4 qtableview model-view