2012-09-15 86 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; 
} 
相關問題