我在我的Qt程序中使用模型/视图概念,其中委托用于编辑QTreeView中的QStandardItem
。代表由QComboxBox
s。
对于QComboBox
代表,我重新实现了QItemDelegate
的以下功能:
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
setModelData
最后将所选索引写回模型(QStandardItemModel
)。这是通过将QComboBox的选择索引存储到QStandardItem的数据中来完成的。然后,将从setModelData内发出最终信号,以指示模型更新视图中的所有项目。由于视图中不同项之间存在依赖关系,因此需要更新(如果更改了一个项值,则其他位置的项值也将更改)。
一切都很好。值将存储回模型。
但是,在模型中,我正在执行一个函数来使用setText
函数更新一些QStandardItems文本。
这是我的问题:
当我从QComboBox中选择一个项目时,组合将被关闭,信号被发出,模型将更新所有相关的QStandardItem文本。例外:我仍然选择并且由QComboBox委派的项目没有更新的文本。似乎代理尚未被销毁,setText
函数根本不影响QStandardItem文本值。
以下是一些说明问题的屏幕截图: 如您所见,通过模型的更新功能,它应具有“:”格式。但是,即使之后没有聚焦,QComboBox值仍然可见。
我可以通过再次发送更新请求信号来解决此问题,但我不知道何时这样做。
仅供参考:如果我选择另一个项目进行编辑并通过选择适当的索引来完成,则更新功能将在所有项目上运行,当然也会再次更新最后一个未更新的项目(除了上面提到的最后编辑的项目)上文)。