【问题标题】:Item views: setSelectionModel and support for row editing项目视图:setSelectionModel 并支持行编辑
【发布时间】:2022-11-10 18:48:24
【问题描述】:

在我的 Qt (6.3.1) 应用程序中,对于我开发的模型,我注意到 submit() 方法一直被调用。
经过一些调试,我注意到,在void QTableView::setSelectionModel/QTreeView::setSelectionModel,这是:

    if (d->selectionModel) {
        // support row editing
        connect(d->selectionModel, SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
                d->model, SLOT(submit()));
    }

QAbstractItemModel::submit() 的文档提到“此功能通常用于行编辑”,这意味着这是故意的。

与让/要求应用程序开发人员自己创建连接的替代方案相比,这种做事方式有不止一个问题:

  • 视图似乎没有阻止创建此连接的属性,因此该行为不仅仅是默认行为,它是强制性的。
  • 除了查看 Qt 的源代码外,我看不出有任何方法知道该怎么做。如果需要,我宁愿自己创建连接。
  • 似乎只有QSqlTableModel 有处理这个问题的机制(editStrategy()),但我在QAbstractItemModelQAbstractTableModel 都找不到任何东西。

-> 什么是希望上述连接成为的充分理由总是创建?
或者我认为这个设计是一个糟糕的设计可能是错误的?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    4 周后回答我自己的问题,没有其他答案,也没有任何评论。

    尽管找到了一个似乎在每种情况下都有效的解决方案(见下文),但我仍然认为 Qt 做出的这种设计选择以及他们实现的其他特殊情况是不好的选择,有兴趣阅读 cmets 中的其他意见。


    比断开信号更好,我最终实现的解决方案是继承QIdentityProxyModel 并创建一个属性来阻止对submit 的调用(+ 可选revert)。

    void MyModel::revert() {
        if (forwardRevertCalls)
            QIdentityProxyModel::revert();
    }
    bool MyModel::submit() {
        if (forwardSubmitCalls)
            return QIdentityProxyModel::submit();
        else
            return false;
    }
    

    这种选择的原因是因为QStyledItemDelegate::eventFilter 中的另一个特殊情况。在文档中找到:

    如果编辑器的类型是 QTextEdit 或 QPlainTextEdit 则不处理 Enter 和 Return 键。

    而且我想像QSpinBox 这样的事情不会这样。

    这导致每当我按下 Enter 以验证模型中的输入并更改 1 个输入中的选定行时,都会调用 submit;更准确地说,它将在QAbstractItemView::closeEditor 中执行case QAbstractItemDelegate::SubmitModelCache

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多