Qt:在编辑 QTableView 项目数据时而不是在编辑完成后发出信号?
Posted
技术标签:
【中文标题】Qt:在编辑 QTableView 项目数据时而不是在编辑完成后发出信号?【英文标题】:Qt: Signal while a QTableView item data is being edited instead of after edit is done? 【发布时间】:2012-04-09 23:11:56 【问题描述】:我有一个 QTableView,它的模型中有一些基于 QString 的项目。我在我的表格模型中实现了 setData,因此可以进行编辑(我可以更改单元格中的数据,调用 setData 来更新模型,并且表格已正确更新)。
目前 setData 仅在用户完成编辑时调用,例如在他们按 Enter 或单击文本输入框以完成文本输入后。我想在用户在文本编辑控件中键入/编辑时更新表格的其他其他部分,而不是在他们完成并且编辑的内容最终确定之后。
我想要的一个简单示例是下一个表格单元格显示已在正在编辑的单元格中输入了多少个字符的计数,但要在用户键入/编辑单元格内容时执行此操作,不仅仅是在编辑完成并调用 setData 之后。
任何指向我应该寻找什么的指针?谢谢!
【问题讨论】:
【参考方案1】:您可以继承 QStyledItemDelegate
并在发生变化时提交数据,然后使用 QAbstractItemView::setItemDelegate
为视图设置该委托。
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;
;
【讨论】:
【参考方案2】:
当我需要持久性时,@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
转换常量并使其为编辑器提交数据。
请注意,在 lambda 中,我们通过值 [=]
捕获 editor
变量,否则,当函数超出范围时,使用引用捕获会使 editor
的值未定义。
【讨论】:
以上是关于Qt:在编辑 QTableView 项目数据时而不是在编辑完成后发出信号?的主要内容,如果未能解决你的问题,请参考以下文章