无法为“QModelIndex”获取“QWidget* 编辑器”

Posted

技术标签:

【中文标题】无法为“QModelIndex”获取“QWidget* 编辑器”【英文标题】:Trouble getting `QWidget* editor` for a `QModelIndex` 【发布时间】: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 函数,所以我什至无法将指向创建的编辑器的指针保存在成员变量中。 【参考方案1】:

为什么你不能只过滤事件来开始编辑?

如果 state 是 != QAbstractItemView::EditingState 则处理事件

在此函数中返回 true 会使事件停止传播到过滤的对象。

如果状态是 Editing,你可以返回 false 并允许表格和编辑器继续处理事件。

类似这样的:

 bool FilterObject::eventFilter(QObject *object, QEvent *event)
 
   if (object == tableView && event->type() == QEvent::KeyPress) 
       QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
       if (keyEvent->key() == Qt::Key_Return && tableView->state() != QAbstractItemView::EditingState) 
           // set current cell to edit
         return true;
        else
         return false;
   
   return false;
 

【讨论】:

以上是关于无法为“QModelIndex”获取“QWidget* 编辑器”的主要内容,如果未能解决你的问题,请参考以下文章

从 QTreeView 中的 QModelIndex 获取平面行索引

Qt之QHeaderView自定义排序(获取正确的QModelIndex)

如何将 QModelIndex 设置为 QListView

在 QTreeView 中找到 QModelIndex 可见行的更简单方法

QModelIndex::数据不工作

QModelIndex 与 QStandardItem互转