我试图理解一个非常具体的概念,其中模型中的值可以用于小部件。QComboBox是一个需要一些内部查找的特定小部件。
QDataWidgetMapper通过“addMapping”向模型中的索引添加QComboBox,也可以设置特定属性。如果文本出现在QComboBox中的值中,那么最简单的方法“就可以工作”。在引擎盖下可能有一些QItemDelegate,它可以使模型具有普通字符串,并且QComboBox将正确选择正确的项。
我试图在C++中找到实际的实现。我希望它会发生在QComboBoxDelegate中,但没有任何迹象表明已经完成了任何索引查找。在超类QStyledItemDelegate中,使用了setEditorData和editor->setProperty(n,v)。是从setCurrentText调用的那一点开始的吗?Is editor->metaObject()->userProperty().name();由于Q_PROPERTY(QString currentText READ currentText WRITE setCurrentText NOTIFY currentTextChanged USER true)而工作?
QStyledItemDelegate: commit QComboBox value to model on clickQDataWidgetMapper ignoring inheritance
1条答案
按热度按时间qoefvg9y1#
当创建一个新的QDataWidgetMapper示例时,它会在内部创建并设置一个基本的QItemDelegate作为其初始委托[1]。
addMapping()
有两种使用方法:通过使用小部件和部分,或者还通过提供特定于该小部件的属性名称。当widget被更新[2]时,只有widget和section用于
addMapping()
,QDataWidgetMapper在delegate上调用setEditorData()
:默认实现将数据存储在 editor 小部件的user property中。
QComboBox的
USER
属性实际上是currentText
[3]:如果组合框是可编辑的,则setter
setCurrentText()
只需调用setEditText()
。否则,如果列表中有匹配的文本,currentIndex
将被设置为相应的索引。如果需要使用组合框更好地控制Map器的行为,您有不同的可能性:
USER
属性(最后声明的用户属性总是被认为是实际的属性);addMapping()
重载中提供其名称;在这种情况下,Qt将简单地调用具有给定属性名的小部件上的setProperty()
;setEditorData()
,可能的话,覆盖setModelData()
;注意,对于第三个选择,基本QItemDelegate(甚至QAbstractItemDelegate)应该足够了。由于某些原因,Qt 6使用QStyledItemDelegate代替。
[1]请参阅
qdatawidgetmapper.cpp
中的构造函数(Qt 5源代码,codebrowser.dev)。[2]在同一代码中查看
populate()
函数(Qt,codebrowser)。[3]如果组合是可编辑的,则设置行编辑上的文本,否则使用
findText()
,如果索引>= 0,则最终使用setCurrentIndex()
。