我有一个QTableView,它的模型中有一些基于QString的项目。我在表模型中实现了setData,因此编辑工作正常(我可以更改单元格中的数据,调用setData来更新模型,并且表格已正确更新)。
目前只在用户完成编辑时调用setData,例如在他们按Enter键或单击文本输入框以完成文本输入后。我希望在用户输入/编辑文本编辑控件时更新表的其他其他部分,而不是在完成后完成编辑的内容。
我想要的一个简单示例是,下一个表格单元格显示已编辑的单元格中输入了多少个字符的计数,但是当用户键入/编辑单元格内容时执行此操作,不仅在完成编辑并调用setData之后。
指向我应该寻找的东西?谢谢!
答案 0 :(得分: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;
}
};
答案 1 :(得分:0)
当我需要持久性时,@ alexisdm提供的答案对我不起作用
编辑器由QAbstractTableModel::setPersistentEditor(QModelIndex())
启用。
以下解决了这个问题:
class Delegate : public QStyledItemDelegate
{
Q_OBJECT
public:
// ... omitted for brevity
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const override
{
auto *editor = static_cast<QLineEdit*>(
QStyledItemDelegate::createEditor(parent, option, index));
if (editor) {
connect(editor,
&QLineEdit::textChanged,
[=] (const QString &)
{
const_cast<Delegate*>(this)->commitData(editor);
});
}
return editor;
}
// ... omitted for brevity
};
我们只是从this
转换constness并使其为编辑器提交数据。
请注意,在lambda中,我们通过值editor
捕获[=]
变量,否则,当函数超出范围时,使用引用捕获会使editor
的值未定义。 / p>