2012-04-09 48 views
1

我有一個QTableView,它的模型中有一些基於QString的項目。我在我的表模型中實現了setData,所以編輯工作正常(我可以更改單元格中的數據,setData被調用來更新模型,並且表格被正確更新)。Qt:QTableView項目數據正在編輯而不是編輯完成後發出信號?

當前setData僅在用戶完成編輯時被調用,例如,他們按Enter鍵後,或者點擊文本輸入框以完成文本輸入。我想在用戶在文本編輯控件中輸入/編輯時更新表格的其他部分,而不是在完成編輯後的內容並完成編輯後的內容。

我想要的一個簡單例子是,下一個表格單元格顯示有多少字符輸入到正在編輯的單元格中,但是要在用戶鍵入/編輯單元格內容時執行此操作,不僅在編輯完成並調用setData之後。

任何指向我應該找的東西?謝謝!

回答

1

您可以繼承QStyledItemDelegate的子類並在發生更改時提交數據,然後使用QAbstractItemView::setDelegateForColumn將該代理設置爲該視圖。

class MyDelegate : public QStyledItemDelegate { 
    QSignalMapper *mapper; 
public: 
    MyDelegate(QObject*parent = 0) 
    : QStyledItemDelegate(parent) 
    , mapper(new QSignalMapper(this)) 
    { 
     connect(mapper, SIGNAL(mapped(QWidget*)), SIGNAL(commitData(QWidget*))); 
    } 
    QWidget * createEditor(QWidget * parent, const QStyleOptionViewItem & option, 
      const QModelIndex & index) const 
    { 
     QWidget *editor = QStyledItemDelegate::createEditor(parent, option, index); 
     if(qobject_cast<QLineEdit*>(editor)) { 
      connect(editor, SIGNAL(textChanged(QString)), mapper, SLOT(map())); 
      mapper->setMapping(editor, editor); 
     } 
     return editor; 
    } 
};