1

我有一个 QTableView,它的模型中有一些基于 QString 的项目。我在我的表模型中实现了 setData,所以编辑工作正常(我可以更改单元格中的数据,调用 setData 来更新模型,并且表已正确更新)。

当前 setData 仅在用户完成编辑时调用,例如在他们按 Enter 或单击文本输入框以完成文本输入之后。我想在用户在文本编辑控件中键入/编辑时更新表格的其他其他部分,而不是在他们完成并且编辑的内容最终确定之后。

我想要的一个简单示例是下一个表格单元格显示已在正在编辑的单元格中输入了多少字符的计数,但是要在用户键入/编辑单元格内容时执行此操作,而不仅仅是在之后编辑完成并调用 setData。

任何指向我应该寻找的东西?谢谢!

4

2 回答 2

2

您可以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;
   }
};
于 2012-04-10T00:05:04.707 回答
0

当我需要一个由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
};

我们只是简单地从 constness 中转换this并使其为编辑器提交数据。

请注意,在 lambda 中,我们editor按值捕获变量,否则,当函数超出范围时[=],使用引用捕获会使 undefined 的值。editor

于 2018-03-11T14:06:09.460 回答