2012-09-15 37 views
0

我无法扩大QTableView的默认编辑行为。当按Enter键时,我需要以下行为:无法获取`QModelIndex`的QWidget *编辑器

  1. 如果尚未编辑当前单元格,请开始编辑它。
  2. 如果正在编辑单元格,
    • 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而不必重写我的代码?

+0

那么,'QWidget的* QItemDelegate :: createEditor()'原来是一个'const'功能,所以我不能一个指针,即使保存在创建编辑器成员变量。 – wsaleem

回答

2

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

就处理该事件,如果状态!= QAbstractItemView中:: EditingState

回到这个功能真的让事件停止传播到过滤的对象。

如果状态是编辑,您可以返回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; 
} 
相关问题