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 项目数据时而不是在编辑完成后发出信号?的主要内容,如果未能解决你的问题,请参考以下文章

QTableView中的可编辑复选框仅列

Qt Qtableview没有得到标题项目点击的信号

Qt中的QTableView 中的列放入Widget

QT QTableview QItemDelegate 简单使用

Qt模型/视图和QTableView的基本概念

一个 QStandardItemModel 用于不同的 QTableView、通用视图和特定视图