2012-04-09 139 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; 
    } 
};