c++ 当委托失去焦点时取消QTableView中的编辑

shstlldc  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(376)

我使用的是基本的QTableView + QAbstractTableModel架构。数据可以通过QAbstractItemDelegate子类进行编辑。一切都按预期工作,但我需要稍微改变编辑行为:
Qt默认行为是:

  • 对于打开的委托编辑器,按Enter确认编辑
  • 对于打开的委托编辑器,按Escape键可取消编辑
  • 对于打开的委托编辑器,单击不同的表视图单元格可确认编辑

我想去掉最后一个。如果委托编辑器失去焦点,编辑将被取消(即,它将不会发出editingFinished()),这样用户只能通过按Enter键提交更改。
有什么方便的方法吗?
先谢谢你了

vxbzzdmp

vxbzzdmp1#

重写这个类,找出你不想要的最后一个函数,然后重写这个函数,让它的实现为空,然后它就像往常一样被调用,但现在它什么也不做(或者做其他事情,你正在编程让它做你想做的任何事情)

yzxexxkh

yzxexxkh2#

仅当用户与编辑器小部件交互时才在编辑器小部件上设置属性,并在修改模型之前检查setModelData()中是否正确设置了该属性。
例如,我们有一个ButtonDelegate,它似乎在聚焦时被触发。我们应用了一个属性来知道setModelData()何时被点击触发,如下所示:

QWidget * ButtonDelegate::createEditor(QWidget * parent,
                                       QStyleOptionViewItem const &,
                                       QModelIndex const &) const
{
    auto editor = new QToolButton(parent);
    connect(editor, &QAbstractButton::clicked, this, [=]
    {
        editor->setProperty("clicked", true);
        Q_EMIT const_cast<ButtonDelegate *>(this)->commitData(editor);
    });
    return editor;
}

void ButtonDelegate::setModelData(QWidget * editor, QAbstractItemModel * model,
                                  QModelIndex const & index) const
{
    if (model && index.isValid() && editor->property("clicked") == true)
    {
        model->setData(index, true, Qt::CheckStateRole);
        editor->setProperty("clicked", {}); // Reset to handle next click
    }
}
afdcj2ne

afdcj2ne3#

我将覆盖模型中的QAbstractItemModel::setData(),并跳过在尝试为给定项设置相同数据时发出dataChanged()

相关问题