0

我无法增加QTableView. 当按下 Enter 键时,我想要以下行为:

  1. 如果尚未编辑当前单元格,则开始编辑当前单元格。
  2. 如果正在编辑单元格,
    • 2a。提交数据并关闭编辑器。然后,
    • 2b。使下面的单元格(如果存在)成为当前单元格。

2a 是默认行为,而 2b 很可能通过QAbstractItemView::setCurrentIndex()在重新实现中使用来实现(如此处在类似上下文QItemDelegate::eventFilter()中建议的那样)。

问题在于实现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 已损坏。所以,我需要查看上面的else子句,CourseTable::handleEnter_()可能会调用它。问题是这两个函数都需要一个我无法弄清楚如何获得的参数。我可以子类化,向派生类添加方法,并修改现有代码以将派生委托类的实例传递给函数。但这听起来工作量太大了。QAbstractItemView::commitData()QAbstractItemView::closeEditorQWidget *editorQAbstractItemDelegategetEditor()CourseTable::setItemDelegate*()

那么,有什么想法可以在不重写代码的情况下干净地完成 1 和 2 吗?

4

1 回答 1

2

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

如果状态为 != 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;
 }
于 2012-12-10T15:35:14.103 回答