【问题标题】:Interact with editor widgets' data in QTableView在 QTableView 中与编辑器小部件的数据交互
【发布时间】:2012-10-02 05:06:37
【问题描述】:

我正在使用可编辑的 QTableView + QStandardItemModel。

在表格视图中编辑单元格时,我想在将新数据提交到表格视图时,根据该特定单元格中的新输入数据做一些事情。

为此,我需要新的输入数据和当前模型索引(或列和行号)。 我尝试了一些插槽,例如

virtual void closeEditor(QWidget * 编辑器, QAbstractItemDelegate::EndEditHint 提示)

virtual void commitData (QWidget * editor).

commitData 似乎是我需要的,但是,参数只是编辑器,我不知道如何获取此编辑器小部件中的文本。 我查看了 QTextEdit,但它不是 QWidget 的继承类。

不知道有没有办法获取编辑器小部件的数据(文本)和轴(列、行)?

【问题讨论】:

    标签: qt qt4 qwidget qtableview qtgui


    【解决方案1】:

    我建议实现你自己的项目委托,继承QStandardItemDelegate(或QAbstractItemDelegate)。在那里你可以覆盖

    void setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const
    

    您只需进行自定义处理,然后致电QStandardItemDelegate::setModelData(...) 以确保您的模型已使用新编辑的数据进行更新。

    【讨论】:

    • 谢谢!我会尝试编写一个这样的继承类。 :) 似乎没有更简单的方法可以做到这一点。顺便说一句,我对编辑器小部件不熟悉,当我调用 setModelData 时,如何获取当前激活的编辑器作为参数?还是我也应该写一个定制的编辑器?编辑器小部件总是让我感到困惑,我在网上找不到太多有用的文档。 (例如,一旦我可以在commitData中与编辑器进行通信,我需要的功能应该很简单,但我不知道该怎么做。)
    • 你不必打电话给setModelData();它应该在编辑器提交编辑操作时被视图调用。
    【解决方案2】:

    每当项目的数据发生变化时,QStandardItemModel 就会发出itemChanged(QStandardItem*) 信号。

    从给定的QStandardItem,您可以直接检索行和列。要获取显示的文本,请将Qt::DisplayRole 传递给项目的data() 方法。

    【讨论】:

    • 非常感谢 :) 我尝试了一些与数据更改相关的信号,这种信号在大多数情况下很有帮助。但是,即使数据没有改变,我仍然需要做检查,以防编辑模式触发了默认但无效的值(需要用户输入,没有有效的默认值),并在修改前提交。
    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多