Qt:在编辑QTableView项目数据时发出信号而不是在编辑完成后发出信号?

时间:2012-04-09 23:11:57

标签: qt qtableview qabstracttablemodel

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

目前只在用户完成编辑时调用setData,例如在他们按Enter键或单击文本输入框以完成文本输入后。我希望在用户输入/编辑文本编辑控件时更新表的其他其他部分,而不是在完成后完成编辑的内容。

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

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

2 个答案:

答案 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>