我無法擴大QTableView
的默認編輯行爲。當按Enter鍵時,我需要以下行爲:無法獲取`QModelIndex`的QWidget *編輯器
- 如果尚未編輯當前單元格,請開始編輯它。
- 如果正在編輯單元格,
- 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而不必重寫我的代碼?
那麼,'QWidget的* QItemDelegate :: createEditor()'原來是一個'const'功能,所以我不能一個指針,即使保存在創建編輯器成員變量。 – wsaleem